From 99b200f9eb33725e6161f3eb274cc8aeadb0b143 Mon Sep 17 00:00:00 2001 From: James Date: Sat, 4 Apr 2020 22:42:12 -0400 Subject: [PATCH 1/5] Remove old curl --- CMake/Helpers/CMakeWindows.cmake | 4 +- extern/CMakeLists.txt | 1 - extern/libcurl/CMakeLists.txt | 13 - extern/libcurl/include/Makefile.am | 5 - extern/libcurl/include/README | 55 - extern/libcurl/include/curl/Makefile.am | 53 - extern/libcurl/include/curl/curl.h | 2553 ----------------- extern/libcurl/include/curl/curlbuild.h | 586 ---- extern/libcurl/include/curl/curlbuild.h.cmake | 197 -- extern/libcurl/include/curl/curlbuild.h.in | 197 -- extern/libcurl/include/curl/curlrules.h | 239 -- extern/libcurl/include/curl/curlver.h | 77 - extern/libcurl/include/curl/easy.h | 102 - extern/libcurl/include/curl/mprintf.h | 50 - extern/libcurl/include/curl/multi.h | 439 --- extern/libcurl/include/curl/stdcheaders.h | 33 - extern/libcurl/include/curl/system.h | 484 ---- extern/libcurl/include/curl/typecheck-gcc.h | 668 ----- extern/libcurl/libs/32bit/libcurl_x86.lib | Bin 1917056 -> 0 bytes extern/libcurl/libs/64bit/libcurl.lib | Bin 14074 -> 0 bytes extern/libcurl/windows/32bit/libcurl.dll | Bin 344064 -> 0 bytes extern/libcurl/windows/64bit/libcurl.dll | Bin 366080 -> 0 bytes 22 files changed, 1 insertion(+), 5755 deletions(-) delete mode 100644 extern/libcurl/CMakeLists.txt delete mode 100644 extern/libcurl/include/Makefile.am delete mode 100644 extern/libcurl/include/README delete mode 100644 extern/libcurl/include/curl/Makefile.am delete mode 100644 extern/libcurl/include/curl/curl.h delete mode 100644 extern/libcurl/include/curl/curlbuild.h delete mode 100644 extern/libcurl/include/curl/curlbuild.h.cmake delete mode 100644 extern/libcurl/include/curl/curlbuild.h.in delete mode 100644 extern/libcurl/include/curl/curlrules.h delete mode 100644 extern/libcurl/include/curl/curlver.h delete mode 100644 extern/libcurl/include/curl/easy.h delete mode 100644 extern/libcurl/include/curl/mprintf.h delete mode 100644 extern/libcurl/include/curl/multi.h delete mode 100644 extern/libcurl/include/curl/stdcheaders.h delete mode 100644 extern/libcurl/include/curl/system.h delete mode 100644 extern/libcurl/include/curl/typecheck-gcc.h delete mode 100644 extern/libcurl/libs/32bit/libcurl_x86.lib delete mode 100644 extern/libcurl/libs/64bit/libcurl.lib delete mode 100644 extern/libcurl/windows/32bit/libcurl.dll delete mode 100644 extern/libcurl/windows/64bit/libcurl.dll diff --git a/CMake/Helpers/CMakeWindows.cmake b/CMake/Helpers/CMakeWindows.cmake index f3eb061aae..8370183abe 100644 --- a/CMake/Helpers/CMakeWindows.cmake +++ b/CMake/Helpers/CMakeWindows.cmake @@ -51,14 +51,12 @@ list(APPEND WIN_DLLS "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avcodec-55.dll" "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avformat-55.dll" "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avutil-52.dll" - "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/swscale-2.dll" - "${PROJECT_SOURCE_DIR}/extern/libcurl/windows/${ARCH}/libcurl.dll") + "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/swscale-2.dll") if(ARCH STREQUAL "32bit") list(APPEND WIN_DLLS "${OPENSSL_ROOT_DIR}/libssl-1_1.dll" "${OPENSSL_ROOT_DIR}/libcrypto-1_1.dll") # SSL else() # 64bit list(APPEND WIN_DLLS "${OPENSSL_ROOT_DIR}/libssl-1_1-x64.dll" "${OPENSSL_ROOT_DIR}/libcrypto-1_1-x64.dll") # SSL - list(APPEND WIN_DLLS "${PROJECT_SOURCE_DIR}/extern/libcurl/windows/${ARCH}/libcurl.dll") # CURL endif() foreach(dll ${WIN_DLLS}) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index e63f5bd30a..1763f0835d 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -26,7 +26,6 @@ add_subdirectory(pcre) add_subdirectory(stb) add_subdirectory(libuv) add_subdirectory(zlib) -add_subdirectory(libcurl) add_subdirectory(mad-0.15.1b) add_subdirectory(newogg) add_subdirectory(newvorbis) diff --git a/extern/libcurl/CMakeLists.txt b/extern/libcurl/CMakeLists.txt deleted file mode 100644 index 9decf1e00f..0000000000 --- a/extern/libcurl/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -add_library(curl INTERFACE) -target_include_directories(curl INTERFACE include) - -# TODO: Convert 64bit libcurl to be statically linked. -# Note: Only 32bit Etterna statically links libcurl. 64bit is dynamically linked. -# 64bit is a dll because of how the 64bit/libcurl.lib was generated. When 32bit/libcurl_x86.lib was generated -# it was not statically linked to libcurl. It only contains function references that it expects to find in a dll. -# 64bit/libcurl.lib was not generated like this, so it requires the dll file. -if("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "x64" OR "${CMAKE_GENERATOR}" STREQUAL "Ninja") - target_link_libraries(curl INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/libs/64bit/libcurl.lib") -else() - target_link_libraries(curl INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/libs/32bit/libcurl_x86.lib") -endif() diff --git a/extern/libcurl/include/Makefile.am b/extern/libcurl/include/Makefile.am deleted file mode 100644 index 3b24860299..0000000000 --- a/extern/libcurl/include/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -SUBDIRS = curl - -EXTRA_DIST = README - -AUTOMAKE_OPTIONS = foreign no-dependencies diff --git a/extern/libcurl/include/README b/extern/libcurl/include/README deleted file mode 100644 index 6eb73b2b74..0000000000 --- a/extern/libcurl/include/README +++ /dev/null @@ -1,55 +0,0 @@ - _ _ ____ _ - ___| | | | _ \| | - / __| | | | |_) | | - | (__| |_| | _ <| |___ - \___|\___/|_| \_\_____| - -Include files for libcurl, external users. - -They're all placed in the curl subdirectory here for better fit in any kind -of environment. You must include files from here using... - - #include - -... style and point the compiler's include path to the directory holding the -curl subdirectory. It makes it more likely to survive future modifications. - -NOTE FOR LIBCURL HACKERS - -The following notes apply to libcurl version 7.19.0 and later. - -* The distributed curl/curlbuild.h file is only intended to be used on systems - which can not run the also distributed configure script. - -* The distributed curlbuild.h file is generated as a copy of curlbuild.h.dist - when the libcurl source code distribution archive file is originally created. - -* If you check out from git on a non-configure platform, you must run the - appropriate buildconf* script to set up curlbuild.h and other local files - before being able of compiling the library. - -* On systems capable of running the configure script, the configure process - will overwrite the distributed include/curl/curlbuild.h file with one that - is suitable and specific to the library being configured and built, which - is generated from the include/curl/curlbuild.h.in template file. - -* If you intend to distribute an already compiled libcurl library you _MUST_ - also distribute along with it the generated curl/curlbuild.h which has been - used to compile it. Otherwise the library will be of no use for the users of - the library that you have built. It is _your_ responsibility to provide this - file. No one at the curl project can know how you have built the library. - -* File curl/curlbuild.h includes platform and configuration dependent info, - and must not be modified by anyone. Configure script generates it for you. - -* We cannot assume anything else but very basic compiler features being - present. While libcurl requires an ANSI C compiler to build, some of the - earlier ANSI compilers clearly can't deal with some preprocessor operators. - -* Newlines must remain unix-style for older compilers' sake. - -* Comments must be written in the old-style /* unnested C-fashion */ - -To figure out how to do good and portable checks for features, operating -systems or specific hardwarare, a very good resource is Bjorn Reese's -collection at http://predef.sf.net/ diff --git a/extern/libcurl/include/curl/Makefile.am b/extern/libcurl/include/curl/Makefile.am deleted file mode 100644 index 9011c793cf..0000000000 --- a/extern/libcurl/include/curl/Makefile.am +++ /dev/null @@ -1,53 +0,0 @@ -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at https://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. -# -########################################################################### -pkginclude_HEADERS = \ - curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ - typecheck-gcc.h curlbuild.h curlrules.h system.h - -pkgincludedir= $(includedir)/curl - -# curlbuild.h does not exist in the git tree. When the original libcurl -# source code distribution archive file is created, curlbuild.h.dist is -# renamed to curlbuild.h and included in the tarball so that it can be -# used directly on non-configure systems. -# -# The distributed curlbuild.h will be overwritten on configure systems -# when the configure script runs, with one that is suitable and specific -# to the library being configured and built. -# -# curlbuild.h.in is the distributed template file from which the configure -# script creates curlbuild.h at library configuration time, overwiting the -# one included in the distribution archive. -# -# curlbuild.h.dist is not included in the source code distribution archive. - -EXTRA_DIST = curlbuild.h.in - -DISTCLEANFILES = curlbuild.h - -checksrc: - @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) - -if CURLDEBUG -# for debug builds, we scan the sources on all regular make invokes -all-local: checksrc -endif diff --git a/extern/libcurl/include/curl/curl.h b/extern/libcurl/include/curl/curl.h deleted file mode 100644 index bbc4bf43b1..0000000000 --- a/extern/libcurl/include/curl/curl.h +++ /dev/null @@ -1,2553 +0,0 @@ -#ifndef __CURL_CURL_H -#define __CURL_CURL_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* - * If you have libcurl problems, all docs and details are found here: - * https://curl.haxx.se/libcurl/ - * - * curl-library mailing list subscription and unsubscription web interface: - * https://cool.haxx.se/mailman/listinfo/curl-library/ - */ - -#ifdef CURL_NO_OLDIES -#define CURL_STRICTER -#endif - -#include "curlver.h" /* libcurl version defines */ -#include "system.h" /* determine things run-time */ -#include "curlbuild.h" /* libcurl build definitions */ -#include "curlrules.h" /* libcurl rules enforcement */ - -/* - * Define WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__)) && \ - !defined(WIN32) && !defined(__SYMBIAN32__) -#define WIN32 -#endif - -#include -#include - -#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) -/* Needed for __FreeBSD_version symbol definition */ -#include -#endif - -/* The include stuff here below is mainly for time_t! */ -#include -#include - -#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) -#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ - defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) -/* The check above prevents the winsock2 inclusion if winsock.h already was - included, since they can't co-exist without problems */ -#include -#include -#endif -#endif - -/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish - libc5-based Linux systems. Only include it on systems that are known to - require it! */ -#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ - defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) -#include -#endif - -#if !defined(WIN32) && !defined(_WIN32_WCE) -#include -#endif - -#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) -#include -#endif - -#ifdef __BEOS__ -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) -typedef struct Curl_easy CURL; -typedef struct Curl_share CURLSH; -#else -typedef void CURL; -typedef void CURLSH; -#endif - -/* - * libcurl external API function linkage decorations. - */ - -#ifdef CURL_STATICLIB -# define CURL_EXTERN -#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) -# if defined(BUILDING_LIBCURL) -# define CURL_EXTERN __declspec(dllexport) -# else -# define CURL_EXTERN __declspec(dllimport) -# endif -#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) -# define CURL_EXTERN CURL_EXTERN_SYMBOL -#else -# define CURL_EXTERN -#endif - -#ifndef curl_socket_typedef -/* socket typedef */ -#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) -typedef SOCKET curl_socket_t; -#define CURL_SOCKET_BAD INVALID_SOCKET -#else -typedef int curl_socket_t; -#define CURL_SOCKET_BAD -1 -#endif -#define curl_socket_typedef -#endif /* curl_socket_typedef */ - -struct curl_httppost { - struct curl_httppost *next; /* next entry in the list */ - char *name; /* pointer to allocated name */ - long namelength; /* length of name length */ - char *contents; /* pointer to allocated data contents */ - long contentslength; /* length of contents field, see also - CURL_HTTPPOST_LARGE */ - char *buffer; /* pointer to allocated buffer contents */ - long bufferlength; /* length of buffer field */ - char *contenttype; /* Content-Type */ - struct curl_slist *contentheader; /* list of extra headers for this form */ - struct curl_httppost *more; /* if one field name has more than one - file, this link should link to following - files */ - long flags; /* as defined below */ - -/* specified content is a file name */ -#define CURL_HTTPPOST_FILENAME (1<<0) -/* specified content is a file name */ -#define CURL_HTTPPOST_READFILE (1<<1) -/* name is only stored pointer do not free in formfree */ -#define CURL_HTTPPOST_PTRNAME (1<<2) -/* contents is only stored pointer do not free in formfree */ -#define CURL_HTTPPOST_PTRCONTENTS (1<<3) -/* upload file from buffer */ -#define CURL_HTTPPOST_BUFFER (1<<4) -/* upload file from pointer contents */ -#define CURL_HTTPPOST_PTRBUFFER (1<<5) -/* upload file contents by using the regular read callback to get the data and - pass the given pointer as custom pointer */ -#define CURL_HTTPPOST_CALLBACK (1<<6) -/* use size in 'contentlen', added in 7.46.0 */ -#define CURL_HTTPPOST_LARGE (1<<7) - - char *showfilename; /* The file name to show. If not set, the - actual file name will be used (if this - is a file part) */ - void *userp; /* custom pointer used for - HTTPPOST_CALLBACK posts */ - curl_off_t contentlen; /* alternative length of contents - field. Used if CURL_HTTPPOST_LARGE is - set. Added in 7.46.0 */ -}; - -/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered - deprecated but was the only choice up until 7.31.0 */ -typedef int (*curl_progress_callback)(void *clientp, - double dltotal, - double dlnow, - double ultotal, - double ulnow); - -/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in - 7.32.0, it avoids floating point and provides more detailed information. */ -typedef int (*curl_xferinfo_callback)(void *clientp, - curl_off_t dltotal, - curl_off_t dlnow, - curl_off_t ultotal, - curl_off_t ulnow); - -#ifndef CURL_MAX_READ_SIZE - /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ -#define CURL_MAX_READ_SIZE 524288 -#endif - -#ifndef CURL_MAX_WRITE_SIZE - /* Tests have proven that 20K is a very bad buffer size for uploads on - Windows, while 16K for some odd reason performed a lot better. - We do the ifndef check to allow this value to easier be changed at build - time for those who feel adventurous. The practical minimum is about - 400 bytes since libcurl uses a buffer of this size as a scratch area - (unrelated to network send operations). */ -#define CURL_MAX_WRITE_SIZE 16384 -#endif - -#ifndef CURL_MAX_HTTP_HEADER -/* The only reason to have a max limit for this is to avoid the risk of a bad - server feeding libcurl with a never-ending header that will cause reallocs - infinitely */ -#define CURL_MAX_HTTP_HEADER (100*1024) -#endif - -/* This is a magic return code for the write callback that, when returned, - will signal libcurl to pause receiving on the current transfer. */ -#define CURL_WRITEFUNC_PAUSE 0x10000001 - -typedef size_t (*curl_write_callback)(char *buffer, - size_t size, - size_t nitems, - void *outstream); - - - -/* enumeration of file types */ -typedef enum { - CURLFILETYPE_FILE = 0, - CURLFILETYPE_DIRECTORY, - CURLFILETYPE_SYMLINK, - CURLFILETYPE_DEVICE_BLOCK, - CURLFILETYPE_DEVICE_CHAR, - CURLFILETYPE_NAMEDPIPE, - CURLFILETYPE_SOCKET, - CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ - - CURLFILETYPE_UNKNOWN /* should never occur */ -} curlfiletype; - -#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) -#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) -#define CURLFINFOFLAG_KNOWN_TIME (1<<2) -#define CURLFINFOFLAG_KNOWN_PERM (1<<3) -#define CURLFINFOFLAG_KNOWN_UID (1<<4) -#define CURLFINFOFLAG_KNOWN_GID (1<<5) -#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) -#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) - -/* Content of this structure depends on information which is known and is - achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man - page for callbacks returning this structure -- some fields are mandatory, - some others are optional. The FLAG field has special meaning. */ -struct curl_fileinfo { - char *filename; - curlfiletype filetype; - time_t time; - unsigned int perm; - int uid; - int gid; - curl_off_t size; - long int hardlinks; - - struct { - /* If some of these fields is not NULL, it is a pointer to b_data. */ - char *time; - char *perm; - char *user; - char *group; - char *target; /* pointer to the target filename of a symlink */ - } strings; - - unsigned int flags; - - /* used internally */ - char *b_data; - size_t b_size; - size_t b_used; -}; - -/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ -#define CURL_CHUNK_BGN_FUNC_OK 0 -#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ -#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ - -/* if splitting of data transfer is enabled, this callback is called before - download of an individual chunk started. Note that parameter "remains" works - only for FTP wildcard downloading (for now), otherwise is not used */ -typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, - void *ptr, - int remains); - -/* return codes for CURLOPT_CHUNK_END_FUNCTION */ -#define CURL_CHUNK_END_FUNC_OK 0 -#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ - -/* If splitting of data transfer is enabled this callback is called after - download of an individual chunk finished. - Note! After this callback was set then it have to be called FOR ALL chunks. - Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. - This is the reason why we don't need "transfer_info" parameter in this - callback and we are not interested in "remains" parameter too. */ -typedef long (*curl_chunk_end_callback)(void *ptr); - -/* return codes for FNMATCHFUNCTION */ -#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ -#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ -#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ - -/* callback type for wildcard downloading pattern matching. If the - string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ -typedef int (*curl_fnmatch_callback)(void *ptr, - const char *pattern, - const char *string); - -/* These are the return codes for the seek callbacks */ -#define CURL_SEEKFUNC_OK 0 -#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ -#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so - libcurl might try other means instead */ -typedef int (*curl_seek_callback)(void *instream, - curl_off_t offset, - int origin); /* 'whence' */ - -/* This is a return code for the read callback that, when returned, will - signal libcurl to immediately abort the current transfer. */ -#define CURL_READFUNC_ABORT 0x10000000 -/* This is a return code for the read callback that, when returned, will - signal libcurl to pause sending data on the current transfer. */ -#define CURL_READFUNC_PAUSE 0x10000001 - -typedef size_t (*curl_read_callback)(char *buffer, - size_t size, - size_t nitems, - void *instream); - -typedef enum { - CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ - CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ - CURLSOCKTYPE_LAST /* never use */ -} curlsocktype; - -/* The return code from the sockopt_callback can signal information back - to libcurl: */ -#define CURL_SOCKOPT_OK 0 -#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return - CURLE_ABORTED_BY_CALLBACK */ -#define CURL_SOCKOPT_ALREADY_CONNECTED 2 - -typedef int (*curl_sockopt_callback)(void *clientp, - curl_socket_t curlfd, - curlsocktype purpose); - -struct curl_sockaddr { - int family; - int socktype; - int protocol; - unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it - turned really ugly and painful on the systems that - lack this type */ - struct sockaddr addr; -}; - -typedef curl_socket_t -(*curl_opensocket_callback)(void *clientp, - curlsocktype purpose, - struct curl_sockaddr *address); - -typedef int -(*curl_closesocket_callback)(void *clientp, curl_socket_t item); - -typedef enum { - CURLIOE_OK, /* I/O operation successful */ - CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ - CURLIOE_FAILRESTART, /* failed to restart the read */ - CURLIOE_LAST /* never use */ -} curlioerr; - -typedef enum { - CURLIOCMD_NOP, /* no operation */ - CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ - CURLIOCMD_LAST /* never use */ -} curliocmd; - -typedef curlioerr (*curl_ioctl_callback)(CURL *handle, - int cmd, - void *clientp); - -#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS -/* - * The following typedef's are signatures of malloc, free, realloc, strdup and - * calloc respectively. Function pointers of these types can be passed to the - * curl_global_init_mem() function to set user defined memory management - * callback routines. - */ -typedef void *(*curl_malloc_callback)(size_t size); -typedef void (*curl_free_callback)(void *ptr); -typedef void *(*curl_realloc_callback)(void *ptr, size_t size); -typedef char *(*curl_strdup_callback)(const char *str); -typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); - -#define CURL_DID_MEMORY_FUNC_TYPEDEFS -#endif - -/* the kind of data that is passed to information_callback*/ -typedef enum { - CURLINFO_TEXT = 0, - CURLINFO_HEADER_IN, /* 1 */ - CURLINFO_HEADER_OUT, /* 2 */ - CURLINFO_DATA_IN, /* 3 */ - CURLINFO_DATA_OUT, /* 4 */ - CURLINFO_SSL_DATA_IN, /* 5 */ - CURLINFO_SSL_DATA_OUT, /* 6 */ - CURLINFO_END -} curl_infotype; - -typedef int (*curl_debug_callback) - (CURL *handle, /* the handle/transfer this concerns */ - curl_infotype type, /* what kind of data */ - char *data, /* points to the data */ - size_t size, /* size of the data pointed to */ - void *userptr); /* whatever the user please */ - -/* All possible error codes from all sorts of curl functions. Future versions - may return other values, stay prepared. - - Always add new return codes last. Never *EVER* remove any. The return - codes must remain the same! - */ - -typedef enum { - CURLE_OK = 0, - CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ - CURLE_FAILED_INIT, /* 2 */ - CURLE_URL_MALFORMAT, /* 3 */ - CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for - 7.17.0, reused in April 2011 for 7.21.5] */ - CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ - CURLE_COULDNT_RESOLVE_HOST, /* 6 */ - CURLE_COULDNT_CONNECT, /* 7 */ - CURLE_WEIRD_SERVER_REPLY, /* 8 */ - CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server - due to lack of access - when login fails - this is not returned. */ - CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for - 7.15.4, reused in Dec 2011 for 7.24.0]*/ - CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ - CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server - [was obsoleted in August 2007 for 7.17.0, - reused in Dec 2011 for 7.24.0]*/ - CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ - CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ - CURLE_FTP_CANT_GET_HOST, /* 15 */ - CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. - [was obsoleted in August 2007 for 7.17.0, - reused in July 2014 for 7.38.0] */ - CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ - CURLE_PARTIAL_FILE, /* 18 */ - CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ - CURLE_OBSOLETE20, /* 20 - NOT USED */ - CURLE_QUOTE_ERROR, /* 21 - quote command failure */ - CURLE_HTTP_RETURNED_ERROR, /* 22 */ - CURLE_WRITE_ERROR, /* 23 */ - CURLE_OBSOLETE24, /* 24 - NOT USED */ - CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ - CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ - CURLE_OUT_OF_MEMORY, /* 27 */ - /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error - instead of a memory allocation error if CURL_DOES_CONVERSIONS - is defined - */ - CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ - CURLE_OBSOLETE29, /* 29 - NOT USED */ - CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ - CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ - CURLE_OBSOLETE32, /* 32 - NOT USED */ - CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ - CURLE_HTTP_POST_ERROR, /* 34 */ - CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ - CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ - CURLE_FILE_COULDNT_READ_FILE, /* 37 */ - CURLE_LDAP_CANNOT_BIND, /* 38 */ - CURLE_LDAP_SEARCH_FAILED, /* 39 */ - CURLE_OBSOLETE40, /* 40 - NOT USED */ - CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ - CURLE_ABORTED_BY_CALLBACK, /* 42 */ - CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ - CURLE_OBSOLETE44, /* 44 - NOT USED */ - CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ - CURLE_OBSOLETE46, /* 46 - NOT USED */ - CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ - CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ - CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ - CURLE_OBSOLETE50, /* 50 - NOT USED */ - CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint - wasn't verified fine */ - CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ - CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ - CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as - default */ - CURLE_SEND_ERROR, /* 55 - failed sending network data */ - CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ - CURLE_OBSOLETE57, /* 57 - NOT IN USE */ - CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ - CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ - CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ - CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ - CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ - CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ - CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ - CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind - that failed */ - CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ - CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not - accepted and we failed to login */ - CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ - CURLE_TFTP_PERM, /* 69 - permission problem on server */ - CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ - CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ - CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ - CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ - CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ - CURLE_CONV_FAILED, /* 75 - conversion failed */ - CURLE_CONV_REQD, /* 76 - caller must register conversion - callbacks using curl_easy_setopt options - CURLOPT_CONV_FROM_NETWORK_FUNCTION, - CURLOPT_CONV_TO_NETWORK_FUNCTION, and - CURLOPT_CONV_FROM_UTF8_FUNCTION */ - CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing - or wrong format */ - CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ - CURLE_SSH, /* 79 - error from the SSH layer, somewhat - generic so the error message will be of - interest when this has happened */ - - CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL - connection */ - CURLE_AGAIN, /* 81 - socket is not ready for send/recv, - wait till it's ready and try again (Added - in 7.18.2) */ - CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or - wrong format (Added in 7.19.0) */ - CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in - 7.19.0) */ - CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ - CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ - CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ - CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ - CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ - CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the - session will be queued */ - CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not - match */ - CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ - CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer - */ - CURL_LAST /* never use! */ -} CURLcode; - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Previously obsolete error code re-used in 7.38.0 */ -#define CURLE_OBSOLETE16 CURLE_HTTP2 - -/* Previously obsolete error codes re-used in 7.24.0 */ -#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED -#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT - -/* compatibility with older names */ -#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING -#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY - -/* The following were added in 7.21.5, April 2011 */ -#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION - -/* The following were added in 7.17.1 */ -/* These are scheduled to disappear by 2009 */ -#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION - -/* The following were added in 7.17.0 */ -/* These are scheduled to disappear by 2009 */ -#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ -#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 -#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 -#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 -#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 -#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 -#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 -#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 -#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 -#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 -#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 -#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 -#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN - -#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED -#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE -#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR -#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL -#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS -#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR -#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED - -/* The following were added earlier */ - -#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT - -#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR -#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED -#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED - -#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE -#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME - -/* This was the error code 50 in 7.7.3 and a few earlier versions, this - is no longer used by libcurl but is instead #defined here only to not - make programs break */ -#define CURLE_ALREADY_COMPLETE 99999 - -/* Provide defines for really old option names */ -#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ -#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ -#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA - -/* Since long deprecated options with no code in the lib that does anything - with them. */ -#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 -#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 - -#endif /*!CURL_NO_OLDIES*/ - -/* This prototype applies to all conversion callbacks */ -typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); - -typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ - void *ssl_ctx, /* actually an - OpenSSL SSL_CTX */ - void *userptr); - -typedef enum { - CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use - CONNECT HTTP/1.1 */ - CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT - HTTP/1.0 */ - CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ - CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already - in 7.10 */ - CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ - CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ - CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the - host name rather than the IP address. added - in 7.18.0 */ -} curl_proxytype; /* this enum was added in 7.10 */ - -/* - * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: - * - * CURLAUTH_NONE - No HTTP authentication - * CURLAUTH_BASIC - HTTP Basic authentication (default) - * CURLAUTH_DIGEST - HTTP Digest authentication - * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication - * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) - * CURLAUTH_NTLM - HTTP NTLM authentication - * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour - * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper - * CURLAUTH_ONLY - Use together with a single other type to force no - * authentication or just that single type - * CURLAUTH_ANY - All fine types set - * CURLAUTH_ANYSAFE - All fine types except Basic - */ - -#define CURLAUTH_NONE ((unsigned long)0) -#define CURLAUTH_BASIC (((unsigned long)1)<<0) -#define CURLAUTH_DIGEST (((unsigned long)1)<<1) -#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) -/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ -#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE -#define CURLAUTH_NTLM (((unsigned long)1)<<3) -#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) -#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) -#define CURLAUTH_ONLY (((unsigned long)1)<<31) -#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) -#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) - -#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ -#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ -#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ -#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ -#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ -#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ -#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ -#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY - -#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ -#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ -#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ - -#define CURL_ERROR_SIZE 256 - -enum curl_khtype { - CURLKHTYPE_UNKNOWN, - CURLKHTYPE_RSA1, - CURLKHTYPE_RSA, - CURLKHTYPE_DSS -}; - -struct curl_khkey { - const char *key; /* points to a zero-terminated string encoded with base64 - if len is zero, otherwise to the "raw" data */ - size_t len; - enum curl_khtype keytype; -}; - -/* this is the set of return values expected from the curl_sshkeycallback - callback */ -enum curl_khstat { - CURLKHSTAT_FINE_ADD_TO_FILE, - CURLKHSTAT_FINE, - CURLKHSTAT_REJECT, /* reject the connection, return an error */ - CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so - this causes a CURLE_DEFER error but otherwise the - connection will be left intact etc */ - CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ -}; - -/* this is the set of status codes pass in to the callback */ -enum curl_khmatch { - CURLKHMATCH_OK, /* match */ - CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ - CURLKHMATCH_MISSING, /* no matching host/key found */ - CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ -}; - -typedef int - (*curl_sshkeycallback) (CURL *easy, /* easy handle */ - const struct curl_khkey *knownkey, /* known */ - const struct curl_khkey *foundkey, /* found */ - enum curl_khmatch, /* libcurl's view on the keys */ - void *clientp); /* custom pointer passed from app */ - -/* parameter for the CURLOPT_USE_SSL option */ -typedef enum { - CURLUSESSL_NONE, /* do not attempt to use SSL */ - CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ - CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ - CURLUSESSL_ALL, /* SSL for all communication or fail */ - CURLUSESSL_LAST /* not an option, never use */ -} curl_usessl; - -/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ - -/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the - name of improving interoperability with older servers. Some SSL libraries - have introduced work-arounds for this flaw but those work-arounds sometimes - make the SSL communication fail. To regain functionality with those broken - servers, a user can this way allow the vulnerability back. */ -#define CURLSSLOPT_ALLOW_BEAST (1<<0) - -/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those - SSL backends where such behavior is present. */ -#define CURLSSLOPT_NO_REVOKE (1<<1) - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Backwards compatibility with older names */ -/* These are scheduled to disappear by 2009 */ - -#define CURLFTPSSL_NONE CURLUSESSL_NONE -#define CURLFTPSSL_TRY CURLUSESSL_TRY -#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL -#define CURLFTPSSL_ALL CURLUSESSL_ALL -#define CURLFTPSSL_LAST CURLUSESSL_LAST -#define curl_ftpssl curl_usessl -#endif /*!CURL_NO_OLDIES*/ - -/* parameter for the CURLOPT_FTP_SSL_CCC option */ -typedef enum { - CURLFTPSSL_CCC_NONE, /* do not send CCC */ - CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ - CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ - CURLFTPSSL_CCC_LAST /* not an option, never use */ -} curl_ftpccc; - -/* parameter for the CURLOPT_FTPSSLAUTH option */ -typedef enum { - CURLFTPAUTH_DEFAULT, /* let libcurl decide */ - CURLFTPAUTH_SSL, /* use "AUTH SSL" */ - CURLFTPAUTH_TLS, /* use "AUTH TLS" */ - CURLFTPAUTH_LAST /* not an option, never use */ -} curl_ftpauth; - -/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ -typedef enum { - CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ - CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD - again if MKD succeeded, for SFTP this does - similar magic */ - CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD - again even if MKD failed! */ - CURLFTP_CREATE_DIR_LAST /* not an option, never use */ -} curl_ftpcreatedir; - -/* parameter for the CURLOPT_FTP_FILEMETHOD option */ -typedef enum { - CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ - CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ - CURLFTPMETHOD_NOCWD, /* no CWD at all */ - CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ - CURLFTPMETHOD_LAST /* not an option, never use */ -} curl_ftpmethod; - -/* bitmask defines for CURLOPT_HEADEROPT */ -#define CURLHEADER_UNIFIED 0 -#define CURLHEADER_SEPARATE (1<<0) - -/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ -#define CURLPROTO_HTTP (1<<0) -#define CURLPROTO_HTTPS (1<<1) -#define CURLPROTO_FTP (1<<2) -#define CURLPROTO_FTPS (1<<3) -#define CURLPROTO_SCP (1<<4) -#define CURLPROTO_SFTP (1<<5) -#define CURLPROTO_TELNET (1<<6) -#define CURLPROTO_LDAP (1<<7) -#define CURLPROTO_LDAPS (1<<8) -#define CURLPROTO_DICT (1<<9) -#define CURLPROTO_FILE (1<<10) -#define CURLPROTO_TFTP (1<<11) -#define CURLPROTO_IMAP (1<<12) -#define CURLPROTO_IMAPS (1<<13) -#define CURLPROTO_POP3 (1<<14) -#define CURLPROTO_POP3S (1<<15) -#define CURLPROTO_SMTP (1<<16) -#define CURLPROTO_SMTPS (1<<17) -#define CURLPROTO_RTSP (1<<18) -#define CURLPROTO_RTMP (1<<19) -#define CURLPROTO_RTMPT (1<<20) -#define CURLPROTO_RTMPE (1<<21) -#define CURLPROTO_RTMPTE (1<<22) -#define CURLPROTO_RTMPS (1<<23) -#define CURLPROTO_RTMPTS (1<<24) -#define CURLPROTO_GOPHER (1<<25) -#define CURLPROTO_SMB (1<<26) -#define CURLPROTO_SMBS (1<<27) -#define CURLPROTO_ALL (~0) /* enable everything */ - -/* long may be 32 or 64 bits, but we should never depend on anything else - but 32 */ -#define CURLOPTTYPE_LONG 0 -#define CURLOPTTYPE_OBJECTPOINT 10000 -#define CURLOPTTYPE_STRINGPOINT 10000 -#define CURLOPTTYPE_FUNCTIONPOINT 20000 -#define CURLOPTTYPE_OFF_T 30000 - -/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the - string options from the header file */ - -/* name is uppercase CURLOPT_, - type is one of the defined CURLOPTTYPE_ - number is unique identifier */ -#ifdef CINIT -#undef CINIT -#endif - -#ifdef CURL_ISOCPP -#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu -#else -/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ -#define LONG CURLOPTTYPE_LONG -#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT -#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT -#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT -#define OFF_T CURLOPTTYPE_OFF_T -#define CINIT(name,type,number) CURLOPT_/**/name = type + number -#endif - -/* - * This macro-mania below setups the CURLOPT_[what] enum, to be used with - * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] - * word. - */ - -typedef enum { - /* This is the FILE * or void * the regular output should be written to. */ - CINIT(WRITEDATA, OBJECTPOINT, 1), - - /* The full URL to get/put */ - CINIT(URL, STRINGPOINT, 2), - - /* Port number to connect to, if other than default. */ - CINIT(PORT, LONG, 3), - - /* Name of proxy to use. */ - CINIT(PROXY, STRINGPOINT, 4), - - /* "user:password;options" to use when fetching. */ - CINIT(USERPWD, STRINGPOINT, 5), - - /* "user:password" to use with proxy. */ - CINIT(PROXYUSERPWD, STRINGPOINT, 6), - - /* Range to get, specified as an ASCII string. */ - CINIT(RANGE, STRINGPOINT, 7), - - /* not used */ - - /* Specified file stream to upload from (use as input): */ - CINIT(READDATA, OBJECTPOINT, 9), - - /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE - * bytes big. If this is not used, error messages go to stderr instead: */ - CINIT(ERRORBUFFER, OBJECTPOINT, 10), - - /* Function that will be called to store the output (instead of fwrite). The - * parameters will use fwrite() syntax, make sure to follow them. */ - CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), - - /* Function that will be called to read the input (instead of fread). The - * parameters will use fread() syntax, make sure to follow them. */ - CINIT(READFUNCTION, FUNCTIONPOINT, 12), - - /* Time-out the read operation after this amount of seconds */ - CINIT(TIMEOUT, LONG, 13), - - /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about - * how large the file being sent really is. That allows better error - * checking and better verifies that the upload was successful. -1 means - * unknown size. - * - * For large file support, there is also a _LARGE version of the key - * which takes an off_t type, allowing platforms with larger off_t - * sizes to handle larger files. See below for INFILESIZE_LARGE. - */ - CINIT(INFILESIZE, LONG, 14), - - /* POST static input fields. */ - CINIT(POSTFIELDS, OBJECTPOINT, 15), - - /* Set the referrer page (needed by some CGIs) */ - CINIT(REFERER, STRINGPOINT, 16), - - /* Set the FTP PORT string (interface name, named or numerical IP address) - Use i.e '-' to use default address. */ - CINIT(FTPPORT, STRINGPOINT, 17), - - /* Set the User-Agent string (examined by some CGIs) */ - CINIT(USERAGENT, STRINGPOINT, 18), - - /* If the download receives less than "low speed limit" bytes/second - * during "low speed time" seconds, the operations is aborted. - * You could i.e if you have a pretty high speed connection, abort if - * it is less than 2000 bytes/sec during 20 seconds. - */ - - /* Set the "low speed limit" */ - CINIT(LOW_SPEED_LIMIT, LONG, 19), - - /* Set the "low speed time" */ - CINIT(LOW_SPEED_TIME, LONG, 20), - - /* Set the continuation offset. - * - * Note there is also a _LARGE version of this key which uses - * off_t types, allowing for large file offsets on platforms which - * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. - */ - CINIT(RESUME_FROM, LONG, 21), - - /* Set cookie in request: */ - CINIT(COOKIE, STRINGPOINT, 22), - - /* This points to a linked list of headers, struct curl_slist kind. This - list is also used for RTSP (in spite of its name) */ - CINIT(HTTPHEADER, OBJECTPOINT, 23), - - /* This points to a linked list of post entries, struct curl_httppost */ - CINIT(HTTPPOST, OBJECTPOINT, 24), - - /* name of the file keeping your private SSL-certificate */ - CINIT(SSLCERT, STRINGPOINT, 25), - - /* password for the SSL or SSH private key */ - CINIT(KEYPASSWD, STRINGPOINT, 26), - - /* send TYPE parameter? */ - CINIT(CRLF, LONG, 27), - - /* send linked-list of QUOTE commands */ - CINIT(QUOTE, OBJECTPOINT, 28), - - /* send FILE * or void * to store headers to, if you use a callback it - is simply passed to the callback unmodified */ - CINIT(HEADERDATA, OBJECTPOINT, 29), - - /* point to a file to read the initial cookies from, also enables - "cookie awareness" */ - CINIT(COOKIEFILE, STRINGPOINT, 31), - - /* What version to specifically try to use. - See CURL_SSLVERSION defines below. */ - CINIT(SSLVERSION, LONG, 32), - - /* What kind of HTTP time condition to use, see defines */ - CINIT(TIMECONDITION, LONG, 33), - - /* Time to use with the above condition. Specified in number of seconds - since 1 Jan 1970 */ - CINIT(TIMEVALUE, LONG, 34), - - /* 35 = OBSOLETE */ - - /* Custom request, for customizing the get command like - HTTP: DELETE, TRACE and others - FTP: to use a different list command - */ - CINIT(CUSTOMREQUEST, STRINGPOINT, 36), - - /* FILE handle to use instead of stderr */ - CINIT(STDERR, OBJECTPOINT, 37), - - /* 38 is not used */ - - /* send linked-list of post-transfer QUOTE commands */ - CINIT(POSTQUOTE, OBJECTPOINT, 39), - - CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */ - - CINIT(VERBOSE, LONG, 41), /* talk a lot */ - CINIT(HEADER, LONG, 42), /* throw the header out too */ - CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ - CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ - CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */ - CINIT(UPLOAD, LONG, 46), /* this is an upload */ - CINIT(POST, LONG, 47), /* HTTP POST method */ - CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ - - CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ - - /* Specify whether to read the user+password from the .netrc or the URL. - * This must be one of the CURL_NETRC_* enums below. */ - CINIT(NETRC, LONG, 51), - - CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ - - CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ - CINIT(PUT, LONG, 54), /* HTTP PUT */ - - /* 55 = OBSOLETE */ - - /* DEPRECATED - * Function that will be called instead of the internal progress display - * function. This function should be defined as the curl_progress_callback - * prototype defines. */ - CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), - - /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION - callbacks */ - CINIT(PROGRESSDATA, OBJECTPOINT, 57), -#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA - - /* We want the referrer field set automatically when following locations */ - CINIT(AUTOREFERER, LONG, 58), - - /* Port of the proxy, can be set in the proxy string as well with: - "[host]:[port]" */ - CINIT(PROXYPORT, LONG, 59), - - /* size of the POST input data, if strlen() is not good to use */ - CINIT(POSTFIELDSIZE, LONG, 60), - - /* tunnel non-http operations through a HTTP proxy */ - CINIT(HTTPPROXYTUNNEL, LONG, 61), - - /* Set the interface string to use as outgoing network interface */ - CINIT(INTERFACE, STRINGPOINT, 62), - - /* Set the krb4/5 security level, this also enables krb4/5 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. */ - CINIT(KRBLEVEL, STRINGPOINT, 63), - - /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ - CINIT(SSL_VERIFYPEER, LONG, 64), - - /* The CApath or CAfile used to validate the peer certificate - this option is used only if SSL_VERIFYPEER is true */ - CINIT(CAINFO, STRINGPOINT, 65), - - /* 66 = OBSOLETE */ - /* 67 = OBSOLETE */ - - /* Maximum number of http redirects to follow */ - CINIT(MAXREDIRS, LONG, 68), - - /* Pass a long set to 1 to get the date of the requested document (if - possible)! Pass a zero to shut it off. */ - CINIT(FILETIME, LONG, 69), - - /* This points to a linked list of telnet options */ - CINIT(TELNETOPTIONS, OBJECTPOINT, 70), - - /* Max amount of cached alive connections */ - CINIT(MAXCONNECTS, LONG, 71), - - CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ - - /* 73 = OBSOLETE */ - - /* Set to explicitly use a new connection for the upcoming transfer. - Do not use this unless you're absolutely sure of this, as it makes the - operation slower and is less friendly for the network. */ - CINIT(FRESH_CONNECT, LONG, 74), - - /* Set to explicitly forbid the upcoming transfer's connection to be re-used - when done. Do not use this unless you're absolutely sure of this, as it - makes the operation slower and is less friendly for the network. */ - CINIT(FORBID_REUSE, LONG, 75), - - /* Set to a file name that contains random data for libcurl to use to - seed the random engine when doing SSL connects. */ - CINIT(RANDOM_FILE, STRINGPOINT, 76), - - /* Set to the Entropy Gathering Daemon socket pathname */ - CINIT(EGDSOCKET, STRINGPOINT, 77), - - /* Time-out connect operations after this amount of seconds, if connects are - OK within this time, then fine... This only aborts the connect phase. */ - CINIT(CONNECTTIMEOUT, LONG, 78), - - /* Function that will be called to store headers (instead of fwrite). The - * parameters will use fwrite() syntax, make sure to follow them. */ - CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), - - /* Set this to force the HTTP request to get back to GET. Only really usable - if POST, PUT or a custom request have been used first. - */ - CINIT(HTTPGET, LONG, 80), - - /* Set if we should verify the Common name from the peer certificate in ssl - * handshake, set 1 to check existence, 2 to ensure that it matches the - * provided hostname. */ - CINIT(SSL_VERIFYHOST, LONG, 81), - - /* Specify which file name to write all known cookies in after completed - operation. Set file name to "-" (dash) to make it go to stdout. */ - CINIT(COOKIEJAR, STRINGPOINT, 82), - - /* Specify which SSL ciphers to use */ - CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83), - - /* Specify which HTTP version to use! This must be set to one of the - CURL_HTTP_VERSION* enums set below. */ - CINIT(HTTP_VERSION, LONG, 84), - - /* Specifically switch on or off the FTP engine's use of the EPSV command. By - default, that one will always be attempted before the more traditional - PASV command. */ - CINIT(FTP_USE_EPSV, LONG, 85), - - /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ - CINIT(SSLCERTTYPE, STRINGPOINT, 86), - - /* name of the file keeping your private SSL-key */ - CINIT(SSLKEY, STRINGPOINT, 87), - - /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ - CINIT(SSLKEYTYPE, STRINGPOINT, 88), - - /* crypto engine for the SSL-sub system */ - CINIT(SSLENGINE, STRINGPOINT, 89), - - /* set the crypto engine for the SSL-sub system as default - the param has no meaning... - */ - CINIT(SSLENGINE_DEFAULT, LONG, 90), - - /* Non-zero value means to use the global dns cache */ - CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */ - - /* DNS cache timeout */ - CINIT(DNS_CACHE_TIMEOUT, LONG, 92), - - /* send linked-list of pre-transfer QUOTE commands */ - CINIT(PREQUOTE, OBJECTPOINT, 93), - - /* set the debug function */ - CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), - - /* set the data for the debug function */ - CINIT(DEBUGDATA, OBJECTPOINT, 95), - - /* mark this as start of a cookie session */ - CINIT(COOKIESESSION, LONG, 96), - - /* The CApath directory used to validate the peer certificate - this option is used only if SSL_VERIFYPEER is true */ - CINIT(CAPATH, STRINGPOINT, 97), - - /* Instruct libcurl to use a smaller receive buffer */ - CINIT(BUFFERSIZE, LONG, 98), - - /* Instruct libcurl to not use any signal/alarm handlers, even when using - timeouts. This option is useful for multi-threaded applications. - See libcurl-the-guide for more background information. */ - CINIT(NOSIGNAL, LONG, 99), - - /* Provide a CURLShare for mutexing non-ts data */ - CINIT(SHARE, OBJECTPOINT, 100), - - /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), - CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and - CURLPROXY_SOCKS5. */ - CINIT(PROXYTYPE, LONG, 101), - - /* Set the Accept-Encoding string. Use this to tell a server you would like - the response to be compressed. Before 7.21.6, this was known as - CURLOPT_ENCODING */ - CINIT(ACCEPT_ENCODING, STRINGPOINT, 102), - - /* Set pointer to private data */ - CINIT(PRIVATE, OBJECTPOINT, 103), - - /* Set aliases for HTTP 200 in the HTTP Response header */ - CINIT(HTTP200ALIASES, OBJECTPOINT, 104), - - /* Continue to send authentication (user+password) when following locations, - even when hostname changed. This can potentially send off the name - and password to whatever host the server decides. */ - CINIT(UNRESTRICTED_AUTH, LONG, 105), - - /* Specifically switch on or off the FTP engine's use of the EPRT command ( - it also disables the LPRT attempt). By default, those ones will always be - attempted before the good old traditional PORT command. */ - CINIT(FTP_USE_EPRT, LONG, 106), - - /* Set this to a bitmask value to enable the particular authentications - methods you like. Use this in combination with CURLOPT_USERPWD. - Note that setting multiple bits may cause extra network round-trips. */ - CINIT(HTTPAUTH, LONG, 107), - - /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx - in second argument. The function must be matching the - curl_ssl_ctx_callback proto. */ - CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), - - /* Set the userdata for the ssl context callback function's third - argument */ - CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), - - /* FTP Option that causes missing dirs to be created on the remote server. - In 7.19.4 we introduced the convenience enums for this option using the - CURLFTP_CREATE_DIR prefix. - */ - CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), - - /* Set this to a bitmask value to enable the particular authentications - methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. - Note that setting multiple bits may cause extra network round-trips. */ - CINIT(PROXYAUTH, LONG, 111), - - /* FTP option that changes the timeout, in seconds, associated with - getting a response. This is different from transfer timeout time and - essentially places a demand on the FTP server to acknowledge commands - in a timely manner. */ - CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), -#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT - - /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to - tell libcurl to resolve names to those IP versions only. This only has - affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ - CINIT(IPRESOLVE, LONG, 113), - - /* Set this option to limit the size of a file that will be downloaded from - an HTTP or FTP server. - - Note there is also _LARGE version which adds large file support for - platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ - CINIT(MAXFILESIZE, LONG, 114), - - /* See the comment for INFILESIZE above, but in short, specifies - * the size of the file being uploaded. -1 means unknown. - */ - CINIT(INFILESIZE_LARGE, OFF_T, 115), - - /* Sets the continuation offset. There is also a LONG version of this; - * look above for RESUME_FROM. - */ - CINIT(RESUME_FROM_LARGE, OFF_T, 116), - - /* Sets the maximum size of data that will be downloaded from - * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. - */ - CINIT(MAXFILESIZE_LARGE, OFF_T, 117), - - /* Set this option to the file name of your .netrc file you want libcurl - to parse (using the CURLOPT_NETRC option). If not set, libcurl will do - a poor attempt to find the user's home directory and check for a .netrc - file in there. */ - CINIT(NETRC_FILE, STRINGPOINT, 118), - - /* Enable SSL/TLS for FTP, pick one of: - CURLUSESSL_TRY - try using SSL, proceed anyway otherwise - CURLUSESSL_CONTROL - SSL for the control connection or fail - CURLUSESSL_ALL - SSL for all communication or fail - */ - CINIT(USE_SSL, LONG, 119), - - /* The _LARGE version of the standard POSTFIELDSIZE option */ - CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), - - /* Enable/disable the TCP Nagle algorithm */ - CINIT(TCP_NODELAY, LONG, 121), - - /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 123 OBSOLETE. Gone in 7.16.0 */ - /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 127 OBSOLETE. Gone in 7.16.0 */ - /* 128 OBSOLETE. Gone in 7.16.0 */ - - /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option - can be used to change libcurl's default action which is to first try - "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK - response has been received. - - Available parameters are: - CURLFTPAUTH_DEFAULT - let libcurl decide - CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS - CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL - */ - CINIT(FTPSSLAUTH, LONG, 129), - - CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), - CINIT(IOCTLDATA, OBJECTPOINT, 131), - - /* 132 OBSOLETE. Gone in 7.16.0 */ - /* 133 OBSOLETE. Gone in 7.16.0 */ - - /* zero terminated string for pass on to the FTP server when asked for - "account" info */ - CINIT(FTP_ACCOUNT, STRINGPOINT, 134), - - /* feed cookie into cookie engine */ - CINIT(COOKIELIST, STRINGPOINT, 135), - - /* ignore Content-Length */ - CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), - - /* Set to non-zero to skip the IP address received in a 227 PASV FTP server - response. Typically used for FTP-SSL purposes but is not restricted to - that. libcurl will then instead use the same IP address it used for the - control connection. */ - CINIT(FTP_SKIP_PASV_IP, LONG, 137), - - /* Select "file method" to use when doing FTP, see the curl_ftpmethod - above. */ - CINIT(FTP_FILEMETHOD, LONG, 138), - - /* Local port number to bind the socket to */ - CINIT(LOCALPORT, LONG, 139), - - /* Number of ports to try, including the first one set with LOCALPORT. - Thus, setting it to 1 will make no additional attempts but the first. - */ - CINIT(LOCALPORTRANGE, LONG, 140), - - /* no transfer, set up connection and let application use the socket by - extracting it with CURLINFO_LASTSOCKET */ - CINIT(CONNECT_ONLY, LONG, 141), - - /* Function that will be called to convert from the - network encoding (instead of using the iconv calls in libcurl) */ - CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), - - /* Function that will be called to convert to the - network encoding (instead of using the iconv calls in libcurl) */ - CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), - - /* Function that will be called to convert from UTF8 - (instead of using the iconv calls in libcurl) - Note that this is used only for SSL certificate processing */ - CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), - - /* if the connection proceeds too quickly then need to slow it down */ - /* limit-rate: maximum number of bytes per second to send or receive */ - CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), - CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), - - /* Pointer to command string to send if USER/PASS fails. */ - CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147), - - /* callback function for setting socket options */ - CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), - CINIT(SOCKOPTDATA, OBJECTPOINT, 149), - - /* set to 0 to disable session ID re-use for this transfer, default is - enabled (== 1) */ - CINIT(SSL_SESSIONID_CACHE, LONG, 150), - - /* allowed SSH authentication methods */ - CINIT(SSH_AUTH_TYPES, LONG, 151), - - /* Used by scp/sftp to do public/private key authentication */ - CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152), - CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153), - - /* Send CCC (Clear Command Channel) after authentication */ - CINIT(FTP_SSL_CCC, LONG, 154), - - /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ - CINIT(TIMEOUT_MS, LONG, 155), - CINIT(CONNECTTIMEOUT_MS, LONG, 156), - - /* set to zero to disable the libcurl's decoding and thus pass the raw body - data to the application even when it is encoded/compressed */ - CINIT(HTTP_TRANSFER_DECODING, LONG, 157), - CINIT(HTTP_CONTENT_DECODING, LONG, 158), - - /* Permission used when creating new files and directories on the remote - server for protocols that support it, SFTP/SCP/FILE */ - CINIT(NEW_FILE_PERMS, LONG, 159), - CINIT(NEW_DIRECTORY_PERMS, LONG, 160), - - /* Set the behaviour of POST when redirecting. Values must be set to one - of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ - CINIT(POSTREDIR, LONG, 161), - - /* used by scp/sftp to verify the host's public key */ - CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162), - - /* Callback function for opening socket (instead of socket(2)). Optionally, - callback is able change the address or refuse to connect returning - CURL_SOCKET_BAD. The callback should have type - curl_opensocket_callback */ - CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), - CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), - - /* POST volatile input fields. */ - CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), - - /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ - CINIT(PROXY_TRANSFER_MODE, LONG, 166), - - /* Callback function for seeking in the input stream */ - CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), - CINIT(SEEKDATA, OBJECTPOINT, 168), - - /* CRL file */ - CINIT(CRLFILE, STRINGPOINT, 169), - - /* Issuer certificate */ - CINIT(ISSUERCERT, STRINGPOINT, 170), - - /* (IPv6) Address scope */ - CINIT(ADDRESS_SCOPE, LONG, 171), - - /* Collect certificate chain info and allow it to get retrievable with - CURLINFO_CERTINFO after the transfer is complete. */ - CINIT(CERTINFO, LONG, 172), - - /* "name" and "pwd" to use when fetching. */ - CINIT(USERNAME, STRINGPOINT, 173), - CINIT(PASSWORD, STRINGPOINT, 174), - - /* "name" and "pwd" to use with Proxy when fetching. */ - CINIT(PROXYUSERNAME, STRINGPOINT, 175), - CINIT(PROXYPASSWORD, STRINGPOINT, 176), - - /* Comma separated list of hostnames defining no-proxy zones. These should - match both hostnames directly, and hostnames within a domain. For - example, local.com will match local.com and www.local.com, but NOT - notlocal.com or www.notlocal.com. For compatibility with other - implementations of this, .local.com will be considered to be the same as - local.com. A single * is the only valid wildcard, and effectively - disables the use of proxy. */ - CINIT(NOPROXY, STRINGPOINT, 177), - - /* block size for TFTP transfers */ - CINIT(TFTP_BLKSIZE, LONG, 178), - - /* Socks Service */ - CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */ - - /* Socks Service */ - CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), - - /* set the bitmask for the protocols that are allowed to be used for the - transfer, which thus helps the app which takes URLs from users or other - external inputs and want to restrict what protocol(s) to deal - with. Defaults to CURLPROTO_ALL. */ - CINIT(PROTOCOLS, LONG, 181), - - /* set the bitmask for the protocols that libcurl is allowed to follow to, - as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs - to be set in both bitmasks to be allowed to get redirected to. Defaults - to all protocols except FILE and SCP. */ - CINIT(REDIR_PROTOCOLS, LONG, 182), - - /* set the SSH knownhost file name to use */ - CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183), - - /* set the SSH host key callback, must point to a curl_sshkeycallback - function */ - CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), - - /* set the SSH host key callback custom pointer */ - CINIT(SSH_KEYDATA, OBJECTPOINT, 185), - - /* set the SMTP mail originator */ - CINIT(MAIL_FROM, STRINGPOINT, 186), - - /* set the list of SMTP mail receiver(s) */ - CINIT(MAIL_RCPT, OBJECTPOINT, 187), - - /* FTP: send PRET before PASV */ - CINIT(FTP_USE_PRET, LONG, 188), - - /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ - CINIT(RTSP_REQUEST, LONG, 189), - - /* The RTSP session identifier */ - CINIT(RTSP_SESSION_ID, STRINGPOINT, 190), - - /* The RTSP stream URI */ - CINIT(RTSP_STREAM_URI, STRINGPOINT, 191), - - /* The Transport: header to use in RTSP requests */ - CINIT(RTSP_TRANSPORT, STRINGPOINT, 192), - - /* Manually initialize the client RTSP CSeq for this handle */ - CINIT(RTSP_CLIENT_CSEQ, LONG, 193), - - /* Manually initialize the server RTSP CSeq for this handle */ - CINIT(RTSP_SERVER_CSEQ, LONG, 194), - - /* The stream to pass to INTERLEAVEFUNCTION. */ - CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), - - /* Let the application define a custom write method for RTP data */ - CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), - - /* Turn on wildcard matching */ - CINIT(WILDCARDMATCH, LONG, 197), - - /* Directory matching callback called before downloading of an - individual file (chunk) started */ - CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), - - /* Directory matching callback called after the file (chunk) - was downloaded, or skipped */ - CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), - - /* Change match (fnmatch-like) callback for wildcard matching */ - CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), - - /* Let the application define custom chunk data pointer */ - CINIT(CHUNK_DATA, OBJECTPOINT, 201), - - /* FNMATCH_FUNCTION user pointer */ - CINIT(FNMATCH_DATA, OBJECTPOINT, 202), - - /* send linked-list of name:port:address sets */ - CINIT(RESOLVE, OBJECTPOINT, 203), - - /* Set a username for authenticated TLS */ - CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204), - - /* Set a password for authenticated TLS */ - CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205), - - /* Set authentication type for authenticated TLS */ - CINIT(TLSAUTH_TYPE, STRINGPOINT, 206), - - /* Set to 1 to enable the "TE:" header in HTTP requests to ask for - compressed transfer-encoded responses. Set to 0 to disable the use of TE: - in outgoing requests. The current default is 0, but it might change in a - future libcurl release. - - libcurl will ask for the compressed methods it knows of, and if that - isn't any, it will not ask for transfer-encoding at all even if this - option is set to 1. - - */ - CINIT(TRANSFER_ENCODING, LONG, 207), - - /* Callback function for closing socket (instead of close(2)). The callback - should have type curl_closesocket_callback */ - CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), - CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), - - /* allow GSSAPI credential delegation */ - CINIT(GSSAPI_DELEGATION, LONG, 210), - - /* Set the name servers to use for DNS resolution */ - CINIT(DNS_SERVERS, STRINGPOINT, 211), - - /* Time-out accept operations (currently for FTP only) after this amount - of milliseconds. */ - CINIT(ACCEPTTIMEOUT_MS, LONG, 212), - - /* Set TCP keepalive */ - CINIT(TCP_KEEPALIVE, LONG, 213), - - /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ - CINIT(TCP_KEEPIDLE, LONG, 214), - CINIT(TCP_KEEPINTVL, LONG, 215), - - /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ - CINIT(SSL_OPTIONS, LONG, 216), - - /* Set the SMTP auth originator */ - CINIT(MAIL_AUTH, STRINGPOINT, 217), - - /* Enable/disable SASL initial response */ - CINIT(SASL_IR, LONG, 218), - - /* Function that will be called instead of the internal progress display - * function. This function should be defined as the curl_xferinfo_callback - * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ - CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), - - /* The XOAUTH2 bearer token */ - CINIT(XOAUTH2_BEARER, STRINGPOINT, 220), - - /* Set the interface string to use as outgoing network - * interface for DNS requests. - * Only supported by the c-ares DNS backend */ - CINIT(DNS_INTERFACE, STRINGPOINT, 221), - - /* Set the local IPv4 address to use for outgoing DNS requests. - * Only supported by the c-ares DNS backend */ - CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222), - - /* Set the local IPv4 address to use for outgoing DNS requests. - * Only supported by the c-ares DNS backend */ - CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223), - - /* Set authentication options directly */ - CINIT(LOGIN_OPTIONS, STRINGPOINT, 224), - - /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ - CINIT(SSL_ENABLE_NPN, LONG, 225), - - /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ - CINIT(SSL_ENABLE_ALPN, LONG, 226), - - /* Time to wait for a response to a HTTP request containing an - * Expect: 100-continue header before sending the data anyway. */ - CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), - - /* This points to a linked list of headers used for proxy requests only, - struct curl_slist kind */ - CINIT(PROXYHEADER, OBJECTPOINT, 228), - - /* Pass in a bitmask of "header options" */ - CINIT(HEADEROPT, LONG, 229), - - /* The public key in DER form used to validate the peer public key - this option is used only if SSL_VERIFYPEER is true */ - CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230), - - /* Path to Unix domain socket */ - CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231), - - /* Set if we should verify the certificate status. */ - CINIT(SSL_VERIFYSTATUS, LONG, 232), - - /* Set if we should enable TLS false start. */ - CINIT(SSL_FALSESTART, LONG, 233), - - /* Do not squash dot-dot sequences */ - CINIT(PATH_AS_IS, LONG, 234), - - /* Proxy Service Name */ - CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235), - - /* Service Name */ - CINIT(SERVICE_NAME, STRINGPOINT, 236), - - /* Wait/don't wait for pipe/mutex to clarify */ - CINIT(PIPEWAIT, LONG, 237), - - /* Set the protocol used when curl is given a URL without a protocol */ - CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238), - - /* Set stream weight, 1 - 256 (default is 16) */ - CINIT(STREAM_WEIGHT, LONG, 239), - - /* Set stream dependency on another CURL handle */ - CINIT(STREAM_DEPENDS, OBJECTPOINT, 240), - - /* Set E-xclusive stream dependency on another CURL handle */ - CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241), - - /* Do not send any tftp option requests to the server */ - CINIT(TFTP_NO_OPTIONS, LONG, 242), - - /* Linked-list of host:port:connect-to-host:connect-to-port, - overrides the URL's host:port (only for the network layer) */ - CINIT(CONNECT_TO, OBJECTPOINT, 243), - - /* Set TCP Fast Open */ - CINIT(TCP_FASTOPEN, LONG, 244), - - /* Continue to send data if the server responds early with an - * HTTP status code >= 300 */ - CINIT(KEEP_SENDING_ON_ERROR, LONG, 245), - - /* The CApath or CAfile used to validate the proxy certificate - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CINIT(PROXY_CAINFO, STRINGPOINT, 246), - - /* The CApath directory used to validate the proxy certificate - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CINIT(PROXY_CAPATH, STRINGPOINT, 247), - - /* Set if we should verify the proxy in ssl handshake, - set 1 to verify. */ - CINIT(PROXY_SSL_VERIFYPEER, LONG, 248), - - /* Set if we should verify the Common name from the proxy certificate in ssl - * handshake, set 1 to check existence, 2 to ensure that it matches - * the provided hostname. */ - CINIT(PROXY_SSL_VERIFYHOST, LONG, 249), - - /* What version to specifically try to use for proxy. - See CURL_SSLVERSION defines below. */ - CINIT(PROXY_SSLVERSION, LONG, 250), - - /* Set a username for authenticated TLS for proxy */ - CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251), - - /* Set a password for authenticated TLS for proxy */ - CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252), - - /* Set authentication type for authenticated TLS for proxy */ - CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253), - - /* name of the file keeping your private SSL-certificate for proxy */ - CINIT(PROXY_SSLCERT, STRINGPOINT, 254), - - /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for - proxy */ - CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255), - - /* name of the file keeping your private SSL-key for proxy */ - CINIT(PROXY_SSLKEY, STRINGPOINT, 256), - - /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for - proxy */ - CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257), - - /* password for the SSL private key for proxy */ - CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258), - - /* Specify which SSL ciphers to use for proxy */ - CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259), - - /* CRL file for proxy */ - CINIT(PROXY_CRLFILE, STRINGPOINT, 260), - - /* Enable/disable specific SSL features with a bitmask for proxy, see - CURLSSLOPT_* */ - CINIT(PROXY_SSL_OPTIONS, LONG, 261), - - /* Name of pre proxy to use. */ - CINIT(PRE_PROXY, STRINGPOINT, 262), - - /* The public key in DER form used to validate the proxy public key - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263), - - /* Path to an abstract Unix domain socket */ - CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264), - - /* Suppress proxy CONNECT response headers from user callbacks */ - CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265), - - CURLOPT_LASTENTRY /* the last unused */ -} CURLoption; - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Backwards compatibility with older names */ -/* These are scheduled to disappear by 2011 */ - -/* This was added in version 7.19.1 */ -#define CURLOPT_POST301 CURLOPT_POSTREDIR - -/* These are scheduled to disappear by 2009 */ - -/* The following were added in 7.17.0 */ -#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD -#define CURLOPT_FTPAPPEND CURLOPT_APPEND -#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY -#define CURLOPT_FTP_SSL CURLOPT_USE_SSL - -/* The following were added earlier */ - -#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD -#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL - -#else -/* This is set if CURL_NO_OLDIES is defined at compile-time */ -#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ -#endif - - - /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host - name resolves addresses using more than one IP protocol version, this - option might be handy to force libcurl to use a specific IP version. */ -#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP - versions that your system allows */ -#define CURL_IPRESOLVE_V4 1 /* resolve to IPv4 addresses */ -#define CURL_IPRESOLVE_V6 2 /* resolve to IPv6 addresses */ - - /* three convenient "aliases" that follow the name scheme better */ -#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER - - /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ -enum { - CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd - like the library to choose the best possible - for us! */ - CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ - CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ - CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ - CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ - CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 - Upgrade */ - - CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ -}; - -/* Convenience definition simple because the name of the version is HTTP/2 and - not 2.0. The 2_0 version of the enum name was set while the version was - still planned to be 2.0 and we stick to it for compatibility. */ -#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 - -/* - * Public API enums for RTSP requests - */ -enum { - CURL_RTSPREQ_NONE, /* first in list */ - CURL_RTSPREQ_OPTIONS, - CURL_RTSPREQ_DESCRIBE, - CURL_RTSPREQ_ANNOUNCE, - CURL_RTSPREQ_SETUP, - CURL_RTSPREQ_PLAY, - CURL_RTSPREQ_PAUSE, - CURL_RTSPREQ_TEARDOWN, - CURL_RTSPREQ_GET_PARAMETER, - CURL_RTSPREQ_SET_PARAMETER, - CURL_RTSPREQ_RECORD, - CURL_RTSPREQ_RECEIVE, - CURL_RTSPREQ_LAST /* last in list */ -}; - - /* These enums are for use with the CURLOPT_NETRC option. */ -enum CURL_NETRC_OPTION { - CURL_NETRC_IGNORED, /* The .netrc will never be read. - * This is the default. */ - CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred - * to one in the .netrc. */ - CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. - * Unless one is set programmatically, the .netrc - * will be queried. */ - CURL_NETRC_LAST -}; - -enum { - CURL_SSLVERSION_DEFAULT, - CURL_SSLVERSION_TLSv1, /* TLS 1.x */ - CURL_SSLVERSION_SSLv2, - CURL_SSLVERSION_SSLv3, - CURL_SSLVERSION_TLSv1_0, - CURL_SSLVERSION_TLSv1_1, - CURL_SSLVERSION_TLSv1_2, - CURL_SSLVERSION_TLSv1_3, - - CURL_SSLVERSION_LAST /* never use, keep last */ -}; - -enum { - CURL_SSLVERSION_MAX_NONE = 0, - CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), - CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), - CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), - CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), - CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), - - /* never use, keep last */ - CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) -}; - -enum CURL_TLSAUTH { - CURL_TLSAUTH_NONE, - CURL_TLSAUTH_SRP, - CURL_TLSAUTH_LAST /* never use, keep last */ -}; - -/* symbols to use with CURLOPT_POSTREDIR. - CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 - can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 - | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ - -#define CURL_REDIR_GET_ALL 0 -#define CURL_REDIR_POST_301 1 -#define CURL_REDIR_POST_302 2 -#define CURL_REDIR_POST_303 4 -#define CURL_REDIR_POST_ALL \ - (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) - -typedef enum { - CURL_TIMECOND_NONE, - - CURL_TIMECOND_IFMODSINCE, - CURL_TIMECOND_IFUNMODSINCE, - CURL_TIMECOND_LASTMOD, - - CURL_TIMECOND_LAST -} curl_TimeCond; - - -/* curl_strequal() and curl_strnequal() are subject for removal in a future - libcurl, see lib/README.curlx for details - - !checksrc! disable SPACEBEFOREPAREN 2 -*/ -CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); -CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); - -/* name is uppercase CURLFORM_ */ -#ifdef CFINIT -#undef CFINIT -#endif - -#ifdef CURL_ISOCPP -#define CFINIT(name) CURLFORM_ ## name -#else -/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ -#define CFINIT(name) CURLFORM_/**/name -#endif - -typedef enum { - CFINIT(NOTHING), /********* the first one is unused ************/ - - /* */ - CFINIT(COPYNAME), - CFINIT(PTRNAME), - CFINIT(NAMELENGTH), - CFINIT(COPYCONTENTS), - CFINIT(PTRCONTENTS), - CFINIT(CONTENTSLENGTH), - CFINIT(FILECONTENT), - CFINIT(ARRAY), - CFINIT(OBSOLETE), - CFINIT(FILE), - - CFINIT(BUFFER), - CFINIT(BUFFERPTR), - CFINIT(BUFFERLENGTH), - - CFINIT(CONTENTTYPE), - CFINIT(CONTENTHEADER), - CFINIT(FILENAME), - CFINIT(END), - CFINIT(OBSOLETE2), - - CFINIT(STREAM), - CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */ - - CURLFORM_LASTENTRY /* the last unused */ -} CURLformoption; - -#undef CFINIT /* done */ - -/* structure to be used as parameter for CURLFORM_ARRAY */ -struct curl_forms { - CURLformoption option; - const char *value; -}; - -/* use this for multipart formpost building */ -/* Returns code for curl_formadd() - * - * Returns: - * CURL_FORMADD_OK on success - * CURL_FORMADD_MEMORY if the FormInfo allocation fails - * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form - * CURL_FORMADD_NULL if a null pointer was given for a char - * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed - * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used - * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) - * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated - * CURL_FORMADD_MEMORY if some allocation for string copying failed. - * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array - * - ***************************************************************************/ -typedef enum { - CURL_FORMADD_OK, /* first, no error */ - - CURL_FORMADD_MEMORY, - CURL_FORMADD_OPTION_TWICE, - CURL_FORMADD_NULL, - CURL_FORMADD_UNKNOWN_OPTION, - CURL_FORMADD_INCOMPLETE, - CURL_FORMADD_ILLEGAL_ARRAY, - CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ - - CURL_FORMADD_LAST /* last */ -} CURLFORMcode; - -/* - * NAME curl_formadd() - * - * DESCRIPTION - * - * Pretty advanced function for building multi-part formposts. Each invoke - * adds one part that together construct a full post. Then use - * CURLOPT_HTTPPOST to send it off to libcurl. - */ -CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, - struct curl_httppost **last_post, - ...); - -/* - * callback function for curl_formget() - * The void *arg pointer will be the one passed as second argument to - * curl_formget(). - * The character buffer passed to it must not be freed. - * Should return the buffer length passed to it as the argument "len" on - * success. - */ -typedef size_t (*curl_formget_callback)(void *arg, const char *buf, - size_t len); - -/* - * NAME curl_formget() - * - * DESCRIPTION - * - * Serialize a curl_httppost struct built with curl_formadd(). - * Accepts a void pointer as second argument which will be passed to - * the curl_formget_callback function. - * Returns 0 on success. - */ -CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, - curl_formget_callback append); -/* - * NAME curl_formfree() - * - * DESCRIPTION - * - * Free a multipart formpost previously built with curl_formadd(). - */ -CURL_EXTERN void curl_formfree(struct curl_httppost *form); - -/* - * NAME curl_getenv() - * - * DESCRIPTION - * - * Returns a malloc()'ed string that MUST be curl_free()ed after usage is - * complete. DEPRECATED - see lib/README.curlx - */ -CURL_EXTERN char *curl_getenv(const char *variable); - -/* - * NAME curl_version() - * - * DESCRIPTION - * - * Returns a static ascii string of the libcurl version. - */ -CURL_EXTERN char *curl_version(void); - -/* - * NAME curl_easy_escape() - * - * DESCRIPTION - * - * Escapes URL strings (converts all letters consider illegal in URLs to their - * %XX versions). This function returns a new allocated string or NULL if an - * error occurred. - */ -CURL_EXTERN char *curl_easy_escape(CURL *handle, - const char *string, - int length); - -/* the previous version: */ -CURL_EXTERN char *curl_escape(const char *string, - int length); - - -/* - * NAME curl_easy_unescape() - * - * DESCRIPTION - * - * Unescapes URL encoding in strings (converts all %XX codes to their 8bit - * versions). This function returns a new allocated string or NULL if an error - * occurred. - * Conversion Note: On non-ASCII platforms the ASCII %XX codes are - * converted into the host encoding. - */ -CURL_EXTERN char *curl_easy_unescape(CURL *handle, - const char *string, - int length, - int *outlength); - -/* the previous version */ -CURL_EXTERN char *curl_unescape(const char *string, - int length); - -/* - * NAME curl_free() - * - * DESCRIPTION - * - * Provided for de-allocation in the same translation unit that did the - * allocation. Added in libcurl 7.10 - */ -CURL_EXTERN void curl_free(void *p); - -/* - * NAME curl_global_init() - * - * DESCRIPTION - * - * curl_global_init() should be invoked exactly once for each application that - * uses libcurl and before any call of other libcurl functions. - * - * This function is not thread-safe! - */ -CURL_EXTERN CURLcode curl_global_init(long flags); - -/* - * NAME curl_global_init_mem() - * - * DESCRIPTION - * - * curl_global_init() or curl_global_init_mem() should be invoked exactly once - * for each application that uses libcurl. This function can be used to - * initialize libcurl and set user defined memory management callback - * functions. Users can implement memory management routines to check for - * memory leaks, check for mis-use of the curl library etc. User registered - * callback routines with be invoked by this library instead of the system - * memory management routines like malloc, free etc. - */ -CURL_EXTERN CURLcode curl_global_init_mem(long flags, - curl_malloc_callback m, - curl_free_callback f, - curl_realloc_callback r, - curl_strdup_callback s, - curl_calloc_callback c); - -/* - * NAME curl_global_cleanup() - * - * DESCRIPTION - * - * curl_global_cleanup() should be invoked exactly once for each application - * that uses libcurl - */ -CURL_EXTERN void curl_global_cleanup(void); - -/* linked-list structure for the CURLOPT_QUOTE option (and other) */ -struct curl_slist { - char *data; - struct curl_slist *next; -}; - -/* - * NAME curl_slist_append() - * - * DESCRIPTION - * - * Appends a string to a linked list. If no list exists, it will be created - * first. Returns the new list, after appending. - */ -CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, - const char *); - -/* - * NAME curl_slist_free_all() - * - * DESCRIPTION - * - * free a previously built curl_slist. - */ -CURL_EXTERN void curl_slist_free_all(struct curl_slist *); - -/* - * NAME curl_getdate() - * - * DESCRIPTION - * - * Returns the time, in seconds since 1 Jan 1970 of the time string given in - * the first argument. The time argument in the second parameter is unused - * and should be set to NULL. - */ -CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); - -/* info about the certificate chain, only for OpenSSL builds. Asked - for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ -struct curl_certinfo { - int num_of_certs; /* number of certificates with information */ - struct curl_slist **certinfo; /* for each index in this array, there's a - linked list with textual information in the - format "name: value" */ -}; - -/* enum for the different supported SSL backends */ -typedef enum { - CURLSSLBACKEND_NONE = 0, - CURLSSLBACKEND_OPENSSL = 1, - CURLSSLBACKEND_GNUTLS = 2, - CURLSSLBACKEND_NSS = 3, - CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ - CURLSSLBACKEND_GSKIT = 5, - CURLSSLBACKEND_POLARSSL = 6, - CURLSSLBACKEND_CYASSL = 7, - CURLSSLBACKEND_SCHANNEL = 8, - CURLSSLBACKEND_DARWINSSL = 9, - CURLSSLBACKEND_AXTLS = 10, - CURLSSLBACKEND_MBEDTLS = 11 -} curl_sslbackend; - -/* aliases for library clones and renames */ -#define CURLSSLBACKEND_LIBRESSL 1 -#define CURLSSLBACKEND_BORINGSSL 1 -#define CURLSSLBACKEND_WOLFSSL 6 - -/* Information about the SSL library used and the respective internal SSL - handle, which can be used to obtain further information regarding the - connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ -struct curl_tlssessioninfo { - curl_sslbackend backend; - void *internals; -}; - -#define CURLINFO_STRING 0x100000 -#define CURLINFO_LONG 0x200000 -#define CURLINFO_DOUBLE 0x300000 -#define CURLINFO_SLIST 0x400000 -#define CURLINFO_PTR 0x400000 /* same as SLIST */ -#define CURLINFO_SOCKET 0x500000 -#define CURLINFO_MASK 0x0fffff -#define CURLINFO_TYPEMASK 0xf00000 - -typedef enum { - CURLINFO_NONE, /* first, never use this */ - CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, - CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, - CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, - CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, - CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, - CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, - CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, - CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, - CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, - CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, - CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, - CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, - CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, - CURLINFO_FILETIME = CURLINFO_LONG + 14, - CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, - CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, - CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, - CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, - CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, - CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, - CURLINFO_PRIVATE = CURLINFO_STRING + 21, - CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, - CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, - CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, - CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, - CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, - CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, - CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, - CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, - CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, - CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, - CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, - CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, - CURLINFO_CERTINFO = CURLINFO_PTR + 34, - CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, - CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, - CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, - CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, - CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, - CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, - CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, - CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, - CURLINFO_TLS_SESSION = CURLINFO_PTR + 43, - CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, - CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45, - CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, - CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, - CURLINFO_PROTOCOL = CURLINFO_LONG + 48, - CURLINFO_SCHEME = CURLINFO_STRING + 49, - /* Fill in new entries below here! */ - - CURLINFO_LASTONE = 49 -} CURLINFO; - -/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as - CURLINFO_HTTP_CODE */ -#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE - -typedef enum { - CURLCLOSEPOLICY_NONE, /* first, never use this */ - - CURLCLOSEPOLICY_OLDEST, - CURLCLOSEPOLICY_LEAST_RECENTLY_USED, - CURLCLOSEPOLICY_LEAST_TRAFFIC, - CURLCLOSEPOLICY_SLOWEST, - CURLCLOSEPOLICY_CALLBACK, - - CURLCLOSEPOLICY_LAST /* last, never use this */ -} curl_closepolicy; - -#define CURL_GLOBAL_SSL (1<<0) -#define CURL_GLOBAL_WIN32 (1<<1) -#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) -#define CURL_GLOBAL_NOTHING 0 -#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL -#define CURL_GLOBAL_ACK_EINTR (1<<2) - - -/***************************************************************************** - * Setup defines, protos etc for the sharing stuff. - */ - -/* Different data locks for a single share */ -typedef enum { - CURL_LOCK_DATA_NONE = 0, - /* CURL_LOCK_DATA_SHARE is used internally to say that - * the locking is just made to change the internal state of the share - * itself. - */ - CURL_LOCK_DATA_SHARE, - CURL_LOCK_DATA_COOKIE, - CURL_LOCK_DATA_DNS, - CURL_LOCK_DATA_SSL_SESSION, - CURL_LOCK_DATA_CONNECT, - CURL_LOCK_DATA_LAST -} curl_lock_data; - -/* Different lock access types */ -typedef enum { - CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ - CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ - CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ - CURL_LOCK_ACCESS_LAST /* never use */ -} curl_lock_access; - -typedef void (*curl_lock_function)(CURL *handle, - curl_lock_data data, - curl_lock_access locktype, - void *userptr); -typedef void (*curl_unlock_function)(CURL *handle, - curl_lock_data data, - void *userptr); - - -typedef enum { - CURLSHE_OK, /* all is fine */ - CURLSHE_BAD_OPTION, /* 1 */ - CURLSHE_IN_USE, /* 2 */ - CURLSHE_INVALID, /* 3 */ - CURLSHE_NOMEM, /* 4 out of memory */ - CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ - CURLSHE_LAST /* never use */ -} CURLSHcode; - -typedef enum { - CURLSHOPT_NONE, /* don't use */ - CURLSHOPT_SHARE, /* specify a data type to share */ - CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ - CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ - CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ - CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock - callback functions */ - CURLSHOPT_LAST /* never use */ -} CURLSHoption; - -CURL_EXTERN struct Curl_share *curl_share_init(void); -CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); -CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); - -/**************************************************************************** - * Structures for querying information about the curl library at runtime. - */ - -typedef enum { - CURLVERSION_FIRST, - CURLVERSION_SECOND, - CURLVERSION_THIRD, - CURLVERSION_FOURTH, - CURLVERSION_LAST /* never actually use this */ -} CURLversion; - -/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by - basically all programs ever that want to get version information. It is - meant to be a built-in version number for what kind of struct the caller - expects. If the struct ever changes, we redefine the NOW to another enum - from above. */ -#define CURLVERSION_NOW CURLVERSION_FOURTH - -typedef struct { - CURLversion age; /* age of the returned struct */ - const char *version; /* LIBCURL_VERSION */ - unsigned int version_num; /* LIBCURL_VERSION_NUM */ - const char *host; /* OS/host/cpu/machine when configured */ - int features; /* bitmask, see defines below */ - const char *ssl_version; /* human readable string */ - long ssl_version_num; /* not used anymore, always 0 */ - const char *libz_version; /* human readable string */ - /* protocols is terminated by an entry with a NULL protoname */ - const char * const *protocols; - - /* The fields below this were added in CURLVERSION_SECOND */ - const char *ares; - int ares_num; - - /* This field was added in CURLVERSION_THIRD */ - const char *libidn; - - /* These field were added in CURLVERSION_FOURTH */ - - /* Same as '_libiconv_version' if built with HAVE_ICONV */ - int iconv_ver_num; - - const char *libssh_version; /* human readable string */ - -} curl_version_info_data; - -#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ -#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported - (deprecated) */ -#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ -#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ -#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ -#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported - (deprecated) */ -#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ -#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ -#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ -#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ -#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are - supported */ -#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ -#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ -#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ -#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ -#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper - is supported */ -#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ -#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ -#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ -#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ -#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used - for cookie domain verification */ -#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ - - /* - * NAME curl_version_info() - * - * DESCRIPTION - * - * This function returns a pointer to a static copy of the version info - * struct. See above. - */ -CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); - -/* - * NAME curl_easy_strerror() - * - * DESCRIPTION - * - * The curl_easy_strerror function may be used to turn a CURLcode value - * into the equivalent human readable error string. This is useful - * for printing meaningful error messages. - */ -CURL_EXTERN const char *curl_easy_strerror(CURLcode); - -/* - * NAME curl_share_strerror() - * - * DESCRIPTION - * - * The curl_share_strerror function may be used to turn a CURLSHcode value - * into the equivalent human readable error string. This is useful - * for printing meaningful error messages. - */ -CURL_EXTERN const char *curl_share_strerror(CURLSHcode); - -/* - * NAME curl_easy_pause() - * - * DESCRIPTION - * - * The curl_easy_pause function pauses or unpauses transfers. Select the new - * state by setting the bitmask, use the convenience defines below. - * - */ -CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); - -#define CURLPAUSE_RECV (1<<0) -#define CURLPAUSE_RECV_CONT (0) - -#define CURLPAUSE_SEND (1<<2) -#define CURLPAUSE_SEND_CONT (0) - -#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) -#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) - -#ifdef __cplusplus -} -#endif - -/* unfortunately, the easy.h and multi.h include files need options and info - stuff before they can be included! */ -#include "easy.h" /* nothing in curl is fun without the easy stuff */ -#include "multi.h" - -/* the typechecker doesn't work in C++ (yet) */ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ - ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ - !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) -#include "typecheck-gcc.h" -#else -#if defined(__STDC__) && (__STDC__ >= 1) -/* This preprocessor magic that replaces a call with the exact same call is - only done to make sure application authors pass exactly three arguments - to these functions. */ -#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) -#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) -#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) -#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) -#endif /* __STDC__ >= 1 */ -#endif /* gcc >= 4.3 && !__cplusplus */ - -#endif /* __CURL_CURL_H */ diff --git a/extern/libcurl/include/curl/curlbuild.h b/extern/libcurl/include/curl/curlbuild.h deleted file mode 100644 index ae95095fa5..0000000000 --- a/extern/libcurl/include/curl/curlbuild.h +++ /dev/null @@ -1,586 +0,0 @@ -#ifndef __CURL_CURLBUILD_H -#define __CURL_CURLBUILD_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* ================================================================ */ -/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * See file include/curl/curlbuild.h.in, run configure, and forget - * that this file exists it is only used for non-configure systems. - * But you can keep reading if you want ;-) - * - */ - -/* ================================================================ */ -/* NOTES FOR NON-CONFIGURE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * If you think that something actually needs to be changed, adjusted - * or fixed in this file, then, report it on the libcurl development - * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * Try to keep one section per platform, compiler and architecture, - * otherwise, if an existing section is reused for a different one and - * later on the original is adjusted, probably the piggybacking one can - * be adversely changed. - * - * In order to differentiate between platforms/compilers/architectures - * use only compiler built in predefined preprocessor symbols. - * - * This header file shall only export symbols which are 'curl' or 'CURL' - * prefixed, otherwise public name space would be polluted. - * - * NOTE 2: - * ------- - * - * For any given platform/compiler curl_off_t must be typedef'ed to a - * 64-bit wide signed integral data type. The width of this data type - * must remain constant and independent of any possible large file - * support settings. - * - * As an exception to the above, curl_off_t shall be typedef'ed to a - * 32-bit wide signed integral data type if there is no 64-bit type. - * - * As a general rule, curl_off_t shall not be mapped to off_t. This - * rule shall only be violated if off_t is the only 64-bit data type - * available and the size of off_t is independent of large file support - * settings. Keep your build on the safe side avoiding an off_t gating. - * If you have a 64-bit off_t then take for sure that another 64-bit - * data type exists, dig deeper and you will find it. - * - * NOTE 3: - * ------- - * - * Right now you might be staring at file include/curl/curlbuild.h.dist or - * at file include/curl/curlbuild.h, this is due to the following reason: - * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h - * when the libcurl source code distribution archive file is created. - * - * File include/curl/curlbuild.h.dist is not included in the distribution - * archive. File include/curl/curlbuild.h is not present in the git tree. - * - * The distributed include/curl/curlbuild.h file is only intended to be used - * on systems which can not run the also distributed configure script. - * - * On systems capable of running the configure script, the configure process - * will overwrite the distributed include/curl/curlbuild.h file with one that - * is suitable and specific to the library being configured and built, which - * is generated from the include/curl/curlbuild.h.in template file. - * - * If you check out from git on a non-configure platform, you must run the - * appropriate buildconf* script to set up curlbuild.h and other local files. - * - */ - -/* ================================================================ */ -/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ -/* ================================================================ */ - -#ifdef CURL_SIZEOF_LONG -# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T -# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_SOCKLEN_T -# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_OFF_T -# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_T -# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_TU -# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined -#endif - -#ifdef CURL_FORMAT_OFF_T -# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_OFF_T -# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_T -# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_TU -# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined -#endif - -/* ================================================================ */ -/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ -/* ================================================================ */ - -#if defined(__DJGPP__) || defined(__GO32__) -# if defined(__DJGPP__) && (__DJGPP__ > 1) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SALFORDC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__BORLANDC__) -# if (__BORLANDC__ < 0x520) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TURBOC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__WATCOMC__) -# if defined(__386__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__POCC__) -# if (__POCC__ < 280) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# elif defined(_MSC_VER) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__LCC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SYMBIAN32__) -# if defined(__EABI__) /* Treat all ARM compilers equally */ -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__CW32__) -# pragma longlong on -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__VC32__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MWERKS__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(_WIN32_WCE) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MINGW32__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__VMS) -# if defined(__VAX) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__OS400__) -# if defined(__ILEC400__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__MVS__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURL_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURL_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__370__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURL_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURL_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(TPF) -# define CURL_SIZEOF_LONG 8 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ - -#elif defined(__GNUC__) -# if !defined(__LP64__) && (defined(__ILP32__) || \ - defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ - defined(__sparc__) || defined(__mips__) || defined(__sh__)) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) -# define CURL_SIZEOF_LONG 8 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -#else -# error "Unknown non-configure build target!" - Error Compilation_aborted_Unknown_non_configure_build_target -#endif - -/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_TYPES_H -# include -#endif - -/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_SOCKET_H -# include -#endif - -/* Data type definition of curl_socklen_t. */ - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T - typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; -#endif - -/* Data type definition of curl_off_t. */ - -#ifdef CURL_TYPEOF_CURL_OFF_T - typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; -#endif - -#endif /* __CURL_CURLBUILD_H */ diff --git a/extern/libcurl/include/curl/curlbuild.h.cmake b/extern/libcurl/include/curl/curlbuild.h.cmake deleted file mode 100644 index bbb31a9408..0000000000 --- a/extern/libcurl/include/curl/curlbuild.h.cmake +++ /dev/null @@ -1,197 +0,0 @@ -#ifndef __CURL_CURLBUILD_H -#define __CURL_CURLBUILD_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* ================================================================ */ -/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * If you think that something actually needs to be changed, adjusted - * or fixed in this file, then, report it on the libcurl development - * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * This header file shall only export symbols which are 'curl' or 'CURL' - * prefixed, otherwise public name space would be polluted. - * - * NOTE 2: - * ------- - * - * Right now you might be staring at file include/curl/curlbuild.h.in or - * at file include/curl/curlbuild.h, this is due to the following reason: - * - * On systems capable of running the configure script, the configure process - * will overwrite the distributed include/curl/curlbuild.h file with one that - * is suitable and specific to the library being configured and built, which - * is generated from the include/curl/curlbuild.h.in template file. - * - */ - -/* ================================================================ */ -/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ -/* ================================================================ */ - -#ifdef CURL_SIZEOF_LONG -#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T -#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_SOCKLEN_T -#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_OFF_T -#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_T -#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_TU -#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined -#endif - -#ifdef CURL_FORMAT_OFF_T -#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_OFF_T -#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_T -#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_TU -#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined -#endif - -/* ================================================================ */ -/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ -/* ================================================================ */ - -/* Configure process defines this to 1 when it finds out that system */ -/* header file ws2tcpip.h must be included by the external interface. */ -#cmakedefine CURL_PULL_WS2TCPIP_H -#ifdef CURL_PULL_WS2TCPIP_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/types.h must be included by the external interface. */ -#cmakedefine CURL_PULL_SYS_TYPES_H -#ifdef CURL_PULL_SYS_TYPES_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file stdint.h must be included by the external interface. */ -#cmakedefine CURL_PULL_STDINT_H -#ifdef CURL_PULL_STDINT_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file inttypes.h must be included by the external interface. */ -#cmakedefine CURL_PULL_INTTYPES_H -#ifdef CURL_PULL_INTTYPES_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/socket.h must be included by the external interface. */ -#cmakedefine CURL_PULL_SYS_SOCKET_H -#ifdef CURL_PULL_SYS_SOCKET_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/poll.h must be included by the external interface. */ -#cmakedefine CURL_PULL_SYS_POLL_H -#ifdef CURL_PULL_SYS_POLL_H -# include -#endif - -/* The size of `long', as computed by sizeof. */ -#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} - -/* Integral data type used for curl_socklen_t. */ -#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} - -/* The size of `curl_socklen_t', as computed by sizeof. */ -#define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} - -/* Data type definition of curl_socklen_t. */ -typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; - -/* Signed integral data type used for curl_off_t. */ -#define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} - -/* Data type definition of curl_off_t. */ -typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; - -/* curl_off_t formatting string directive without "%" conversion specifier. */ -#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" - -/* unsigned curl_off_t formatting string without "%" conversion specifier. */ -#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" - -/* curl_off_t formatting string directive with "%" conversion specifier. */ -#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" - -/* The size of `curl_off_t', as computed by sizeof. */ -#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} - -/* curl_off_t constant suffix. */ -#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} - -/* unsigned curl_off_t constant suffix. */ -#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} - -#endif /* __CURL_CURLBUILD_H */ diff --git a/extern/libcurl/include/curl/curlbuild.h.in b/extern/libcurl/include/curl/curlbuild.h.in deleted file mode 100644 index ffab356709..0000000000 --- a/extern/libcurl/include/curl/curlbuild.h.in +++ /dev/null @@ -1,197 +0,0 @@ -#ifndef __CURL_CURLBUILD_H -#define __CURL_CURLBUILD_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* ================================================================ */ -/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * If you think that something actually needs to be changed, adjusted - * or fixed in this file, then, report it on the libcurl development - * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * This header file shall only export symbols which are 'curl' or 'CURL' - * prefixed, otherwise public name space would be polluted. - * - * NOTE 2: - * ------- - * - * Right now you might be staring at file include/curl/curlbuild.h.in or - * at file include/curl/curlbuild.h, this is due to the following reason: - * - * On systems capable of running the configure script, the configure process - * will overwrite the distributed include/curl/curlbuild.h file with one that - * is suitable and specific to the library being configured and built, which - * is generated from the include/curl/curlbuild.h.in template file. - * - */ - -/* ================================================================ */ -/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ -/* ================================================================ */ - -#ifdef CURL_SIZEOF_LONG -#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T -#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_SOCKLEN_T -#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_OFF_T -#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_T -#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_TU -#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined -#endif - -#ifdef CURL_FORMAT_OFF_T -#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_OFF_T -#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_T -#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_TU -#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined -#endif - -/* ================================================================ */ -/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ -/* ================================================================ */ - -/* Configure process defines this to 1 when it finds out that system */ -/* header file ws2tcpip.h must be included by the external interface. */ -#undef CURL_PULL_WS2TCPIP_H -#ifdef CURL_PULL_WS2TCPIP_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/types.h must be included by the external interface. */ -#undef CURL_PULL_SYS_TYPES_H -#ifdef CURL_PULL_SYS_TYPES_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file stdint.h must be included by the external interface. */ -#undef CURL_PULL_STDINT_H -#ifdef CURL_PULL_STDINT_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file inttypes.h must be included by the external interface. */ -#undef CURL_PULL_INTTYPES_H -#ifdef CURL_PULL_INTTYPES_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/socket.h must be included by the external interface. */ -#undef CURL_PULL_SYS_SOCKET_H -#ifdef CURL_PULL_SYS_SOCKET_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/poll.h must be included by the external interface. */ -#undef CURL_PULL_SYS_POLL_H -#ifdef CURL_PULL_SYS_POLL_H -# include -#endif - -/* The size of `long', as computed by sizeof. */ -#undef CURL_SIZEOF_LONG - -/* Integral data type used for curl_socklen_t. */ -#undef CURL_TYPEOF_CURL_SOCKLEN_T - -/* The size of `curl_socklen_t', as computed by sizeof. */ -#undef CURL_SIZEOF_CURL_SOCKLEN_T - -/* Data type definition of curl_socklen_t. */ -typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; - -/* Signed integral data type used for curl_off_t. */ -#undef CURL_TYPEOF_CURL_OFF_T - -/* Data type definition of curl_off_t. */ -typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; - -/* curl_off_t formatting string directive without "%" conversion specifier. */ -#undef CURL_FORMAT_CURL_OFF_T - -/* unsigned curl_off_t formatting string without "%" conversion specifier. */ -#undef CURL_FORMAT_CURL_OFF_TU - -/* curl_off_t formatting string directive with "%" conversion specifier. */ -#undef CURL_FORMAT_OFF_T - -/* The size of `curl_off_t', as computed by sizeof. */ -#undef CURL_SIZEOF_CURL_OFF_T - -/* curl_off_t constant suffix. */ -#undef CURL_SUFFIX_CURL_OFF_T - -/* unsigned curl_off_t constant suffix. */ -#undef CURL_SUFFIX_CURL_OFF_TU - -#endif /* __CURL_CURLBUILD_H */ diff --git a/extern/libcurl/include/curl/curlrules.h b/extern/libcurl/include/curl/curlrules.h deleted file mode 100644 index 0abd9f71d8..0000000000 --- a/extern/libcurl/include/curl/curlrules.h +++ /dev/null @@ -1,239 +0,0 @@ -#ifndef __CURL_CURLRULES_H -#define __CURL_CURLRULES_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* ================================================================ */ -/* COMPILE TIME SANITY CHECKS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * All checks done in this file are intentionally placed in a public - * header file which is pulled by curl/curl.h when an application is - * being built using an already built libcurl library. Additionally - * this file is also included and used when building the library. - * - * If compilation fails on this file it is certainly sure that the - * problem is elsewhere. It could be a problem in the curlbuild.h - * header file, or simply that you are using different compilation - * settings than those used to build the library. - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * Do not deactivate any check, these are done to make sure that the - * library is properly built and used. - * - * You can find further help on the libcurl development mailing list: - * https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * NOTE 2 - * ------ - * - * Some of the following compile time checks are based on the fact - * that the dimension of a constant array can not be a negative one. - * In this way if the compile time verification fails, the compilation - * will fail issuing an error. The error description wording is compiler - * dependent but it will be quite similar to one of the following: - * - * "negative subscript or subscript is too large" - * "array must have at least one element" - * "-1 is an illegal array size" - * "size of array is negative" - * - * If you are building an application which tries to use an already - * built libcurl library and you are getting this kind of errors on - * this file, it is a clear indication that there is a mismatch between - * how the library was built and how you are trying to use it for your - * application. Your already compiled or binary library provider is the - * only one who can give you the details you need to properly use it. - */ - -/* - * Verify that some macros are actually defined. - */ - -#ifndef CURL_SIZEOF_LONG -# error "CURL_SIZEOF_LONG definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing -#endif - -#ifndef CURL_TYPEOF_CURL_SOCKLEN_T -# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing -#endif - -#ifndef CURL_SIZEOF_CURL_SOCKLEN_T -# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing -#endif - -#ifndef CURL_TYPEOF_CURL_OFF_T -# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_FORMAT_CURL_OFF_T -# error "CURL_FORMAT_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_FORMAT_CURL_OFF_TU -# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing -#endif - -#ifndef CURL_SIZEOF_CURL_OFF_T -# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_SUFFIX_CURL_OFF_T -# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_SUFFIX_CURL_OFF_TU -# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing -#endif - -/* - * Macros private to this header file. - */ - -#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 - -#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 - -/* - * Verify that the size previously defined and expected for long - * is the same as the one reported by sizeof() at compile time. - */ - -typedef char - __curl_rule_01__ - [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; - -/* - * Verify that the size previously defined and expected for - * curl_off_t is actually the the same as the one reported - * by sizeof() at compile time. - */ - -typedef char - __curl_rule_02__ - [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; - -/* - * Verify at compile time that the size of curl_off_t as reported - * by sizeof() is greater or equal than the one reported for long - * for the current compilation. - */ - -typedef char - __curl_rule_03__ - [CurlchkszGE(curl_off_t, long)]; - -/* - * Verify that the size previously defined and expected for - * curl_socklen_t is actually the the same as the one reported - * by sizeof() at compile time. - */ - -typedef char - __curl_rule_04__ - [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; - -/* - * Verify at compile time that the size of curl_socklen_t as reported - * by sizeof() is greater or equal than the one reported for int for - * the current compilation. - */ - -typedef char - __curl_rule_05__ - [CurlchkszGE(curl_socklen_t, int)]; - -/* ================================================================ */ -/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ -/* ================================================================ */ - -/* - * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow - * these to be visible and exported by the external libcurl interface API, - * while also making them visible to the library internals, simply including - * curl_setup.h, without actually needing to include curl.h internally. - * If some day this section would grow big enough, all this should be moved - * to its own header file. - */ - -/* - * Figure out if we can use the ## preprocessor operator, which is supported - * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ - * or __cplusplus so we need to carefully check for them too. - */ - -#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ - defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ - defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ - defined(__ILEC400__) - /* This compiler is believed to have an ISO compatible preprocessor */ -#define CURL_ISOCPP -#else - /* This compiler is believed NOT to have an ISO compatible preprocessor */ -#undef CURL_ISOCPP -#endif - -/* - * Macros for minimum-width signed and unsigned curl_off_t integer constants. - */ - -#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) -# define __CURL_OFF_T_C_HLPR2(x) x -# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) -# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ - __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ - __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) -#else -# ifdef CURL_ISOCPP -# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix -# else -# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix -# endif -# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) -# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) -#endif - -/* - * Get rid of macros private to this header file. - */ - -#undef CurlchkszEQ -#undef CurlchkszGE - -#endif /* __CURL_CURLRULES_H */ diff --git a/extern/libcurl/include/curl/curlver.h b/extern/libcurl/include/curl/curlver.h deleted file mode 100644 index 35df628af4..0000000000 --- a/extern/libcurl/include/curl/curlver.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __CURL_CURLVER_H -#define __CURL_CURLVER_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* This header file contains nothing but libcurl version info, generated by - a script at release-time. This was made its own header file in 7.11.2 */ - -/* This is the global package copyright */ -#define LIBCURL_COPYRIGHT "1996 - 2017 Daniel Stenberg, ." - -/* This is the version number of the libcurl package from which this header - file origins: */ -#define LIBCURL_VERSION "7.54.1" - -/* The numeric version number is also available "in parts" by using these - defines: */ -#define LIBCURL_VERSION_MAJOR 7 -#define LIBCURL_VERSION_MINOR 54 -#define LIBCURL_VERSION_PATCH 1 - -/* This is the numeric version of the libcurl version number, meant for easier - parsing and comparions by programs. The LIBCURL_VERSION_NUM define will - always follow this syntax: - - 0xXXYYZZ - - Where XX, YY and ZZ are the main version, release and patch numbers in - hexadecimal (using 8 bits each). All three numbers are always represented - using two digits. 1.2 would appear as "0x010200" while version 9.11.7 - appears as "0x090b07". - - This 6-digit (24 bits) hexadecimal number does not show pre-release number, - and it is always a greater number in a more recent release. It makes - comparisons with greater than and less than work. - - Note: This define is the full hex number and _does not_ use the - CURL_VERSION_BITS() macro since curl's own configure script greps for it - and needs it to contain the full number. -*/ -#define LIBCURL_VERSION_NUM 0x073601 - -/* - * This is the date and time when the full source package was created. The - * timestamp is not stored in git, as the timestamp is properly set in the - * tarballs by the maketgz script. - * - * The format of the date follows this template: - * - * "2007-11-23" - */ -#define LIBCURL_TIMESTAMP "2017-06-14" - -#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) -#define CURL_AT_LEAST_VERSION(x,y,z) \ - (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) - -#endif /* __CURL_CURLVER_H */ diff --git a/extern/libcurl/include/curl/easy.h b/extern/libcurl/include/curl/easy.h deleted file mode 100644 index 5b822e1382..0000000000 --- a/extern/libcurl/include/curl/easy.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef __CURL_EASY_H -#define __CURL_EASY_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif - -CURL_EXTERN struct Curl_easy *curl_easy_init(void); -CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); -CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); -CURL_EXTERN void curl_easy_cleanup(CURL *curl); - -/* - * NAME curl_easy_getinfo() - * - * DESCRIPTION - * - * Request internal information from the curl session with this function. The - * third argument MUST be a pointer to a long, a pointer to a char * or a - * pointer to a double (as the documentation describes elsewhere). The data - * pointed to will be filled in accordingly and can be relied upon only if the - * function returns CURLE_OK. This function is intended to get used *AFTER* a - * performed transfer, all results from this function are undefined until the - * transfer is completed. - */ -CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); - - -/* - * NAME curl_easy_duphandle() - * - * DESCRIPTION - * - * Creates a new curl session handle with the same options set for the handle - * passed in. Duplicating a handle could only be a matter of cloning data and - * options, internal state info and things like persistent connections cannot - * be transferred. It is useful in multithreaded applications when you can run - * curl_easy_duphandle() for each new thread to avoid a series of identical - * curl_easy_setopt() invokes in every thread. - */ -CURL_EXTERN struct Curl_easy *curl_easy_duphandle(CURL *curl); - -/* - * NAME curl_easy_reset() - * - * DESCRIPTION - * - * Re-initializes a CURL handle to the default values. This puts back the - * handle to the same state as it was in when it was just created. - * - * It does keep: live connections, the Session ID cache, the DNS cache and the - * cookies. - */ -CURL_EXTERN void curl_easy_reset(CURL *curl); - -/* - * NAME curl_easy_recv() - * - * DESCRIPTION - * - * Receives data from the connected socket. Use after successful - * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. - */ -CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, - size_t *n); - -/* - * NAME curl_easy_send() - * - * DESCRIPTION - * - * Sends data over the connected socket. Use after successful - * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. - */ -CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, - size_t buflen, size_t *n); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/extern/libcurl/include/curl/mprintf.h b/extern/libcurl/include/curl/mprintf.h deleted file mode 100644 index e20f546e19..0000000000 --- a/extern/libcurl/include/curl/mprintf.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __CURL_MPRINTF_H -#define __CURL_MPRINTF_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -#include -#include /* needed for FILE */ -#include "curl.h" /* for CURL_EXTERN */ - -#ifdef __cplusplus -extern "C" { -#endif - -CURL_EXTERN int curl_mprintf(const char *format, ...); -CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); -CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); -CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, - const char *format, ...); -CURL_EXTERN int curl_mvprintf(const char *format, va_list args); -CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); -CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); -CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, - const char *format, va_list args); -CURL_EXTERN char *curl_maprintf(const char *format, ...); -CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); - -#ifdef __cplusplus -} -#endif - -#endif /* __CURL_MPRINTF_H */ diff --git a/extern/libcurl/include/curl/multi.h b/extern/libcurl/include/curl/multi.h deleted file mode 100644 index 7b6070a528..0000000000 --- a/extern/libcurl/include/curl/multi.h +++ /dev/null @@ -1,439 +0,0 @@ -#ifndef __CURL_MULTI_H -#define __CURL_MULTI_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ -/* - This is an "external" header file. Don't give away any internals here! - - GOALS - - o Enable a "pull" interface. The application that uses libcurl decides where - and when to ask libcurl to get/send data. - - o Enable multiple simultaneous transfers in the same thread without making it - complicated for the application. - - o Enable the application to select() on its own file descriptors and curl's - file descriptors simultaneous easily. - -*/ - -/* - * This header file should not really need to include "curl.h" since curl.h - * itself includes this file and we expect user applications to do #include - * without the need for especially including multi.h. - * - * For some reason we added this include here at one point, and rather than to - * break existing (wrongly written) libcurl applications, we leave it as-is - * but with this warning attached. - */ -#include "curl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) -typedef struct Curl_multi CURLM; -#else -typedef void CURLM; -#endif - -typedef enum { - CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or - curl_multi_socket*() soon */ - CURLM_OK, - CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ - CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ - CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ - CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ - CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ - CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ - CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was - attempted to get added - again */ - CURLM_LAST -} CURLMcode; - -/* just to make code nicer when using curl_multi_socket() you can now check - for CURLM_CALL_MULTI_SOCKET too in the same style it works for - curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ -#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM - -/* bitmask bits for CURLMOPT_PIPELINING */ -#define CURLPIPE_NOTHING 0L -#define CURLPIPE_HTTP1 1L -#define CURLPIPE_MULTIPLEX 2L - -typedef enum { - CURLMSG_NONE, /* first, not used */ - CURLMSG_DONE, /* This easy handle has completed. 'result' contains - the CURLcode of the transfer */ - CURLMSG_LAST /* last, not used */ -} CURLMSG; - -struct CURLMsg { - CURLMSG msg; /* what this message means */ - CURL *easy_handle; /* the handle it concerns */ - union { - void *whatever; /* message-specific data */ - CURLcode result; /* return code for transfer */ - } data; -}; -typedef struct CURLMsg CURLMsg; - -/* Based on poll(2) structure and values. - * We don't use pollfd and POLL* constants explicitly - * to cover platforms without poll(). */ -#define CURL_WAIT_POLLIN 0x0001 -#define CURL_WAIT_POLLPRI 0x0002 -#define CURL_WAIT_POLLOUT 0x0004 - -struct curl_waitfd { - curl_socket_t fd; - short events; - short revents; /* not supported yet */ -}; - -/* - * Name: curl_multi_init() - * - * Desc: inititalize multi-style curl usage - * - * Returns: a new CURLM handle to use in all 'curl_multi' functions. - */ -CURL_EXTERN struct Curl_multi *curl_multi_init(void); - -/* - * Name: curl_multi_add_handle() - * - * Desc: add a standard curl handle to the multi stack - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, - CURL *curl_handle); - - /* - * Name: curl_multi_remove_handle() - * - * Desc: removes a curl handle from the multi stack again - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, - CURL *curl_handle); - - /* - * Name: curl_multi_fdset() - * - * Desc: Ask curl for its fd_set sets. The app can use these to select() or - * poll() on. We want curl_multi_perform() called as soon as one of - * them are ready. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *exc_fd_set, - int *max_fd); - -/* - * Name: curl_multi_wait() - * - * Desc: Poll on all fds within a CURLM set as well as any - * additional fds passed to the function. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, - struct curl_waitfd extra_fds[], - unsigned int extra_nfds, - int timeout_ms, - int *ret); - - /* - * Name: curl_multi_perform() - * - * Desc: When the app thinks there's data available for curl it calls this - * function to read/write whatever there is right now. This returns - * as soon as the reads and writes are done. This function does not - * require that there actually is data available for reading or that - * data can be written, it can be called just in case. It returns - * the number of handles that still transfer data in the second - * argument's integer-pointer. - * - * Returns: CURLMcode type, general multi error code. *NOTE* that this only - * returns errors etc regarding the whole multi stack. There might - * still have occurred problems on invidual transfers even when this - * returns OK. - */ -CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, - int *running_handles); - - /* - * Name: curl_multi_cleanup() - * - * Desc: Cleans up and removes a whole multi stack. It does not free or - * touch any individual easy handles in any way. We need to define - * in what state those handles will be if this function is called - * in the middle of a transfer. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); - -/* - * Name: curl_multi_info_read() - * - * Desc: Ask the multi handle if there's any messages/informationals from - * the individual transfers. Messages include informationals such as - * error code from the transfer or just the fact that a transfer is - * completed. More details on these should be written down as well. - * - * Repeated calls to this function will return a new struct each - * time, until a special "end of msgs" struct is returned as a signal - * that there is no more to get at this point. - * - * The data the returned pointer points to will not survive calling - * curl_multi_cleanup(). - * - * The 'CURLMsg' struct is meant to be very simple and only contain - * very basic information. If more involved information is wanted, - * we will provide the particular "transfer handle" in that struct - * and that should/could/would be used in subsequent - * curl_easy_getinfo() calls (or similar). The point being that we - * must never expose complex structs to applications, as then we'll - * undoubtably get backwards compatibility problems in the future. - * - * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out - * of structs. It also writes the number of messages left in the - * queue (after this read) in the integer the second argument points - * to. - */ -CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, - int *msgs_in_queue); - -/* - * Name: curl_multi_strerror() - * - * Desc: The curl_multi_strerror function may be used to turn a CURLMcode - * value into the equivalent human readable error string. This is - * useful for printing meaningful error messages. - * - * Returns: A pointer to a zero-terminated error message. - */ -CURL_EXTERN const char *curl_multi_strerror(CURLMcode); - -/* - * Name: curl_multi_socket() and - * curl_multi_socket_all() - * - * Desc: An alternative version of curl_multi_perform() that allows the - * application to pass in one of the file descriptors that have been - * detected to have "action" on them and let libcurl perform. - * See man page for details. - */ -#define CURL_POLL_NONE 0 -#define CURL_POLL_IN 1 -#define CURL_POLL_OUT 2 -#define CURL_POLL_INOUT 3 -#define CURL_POLL_REMOVE 4 - -#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD - -#define CURL_CSELECT_IN 0x01 -#define CURL_CSELECT_OUT 0x02 -#define CURL_CSELECT_ERR 0x04 - -typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ - curl_socket_t s, /* socket */ - int what, /* see above */ - void *userp, /* private callback - pointer */ - void *socketp); /* private socket - pointer */ -/* - * Name: curl_multi_timer_callback - * - * Desc: Called by libcurl whenever the library detects a change in the - * maximum number of milliseconds the app is allowed to wait before - * curl_multi_socket() or curl_multi_perform() must be called - * (to allow libcurl's timed events to take place). - * - * Returns: The callback should return zero. - */ -typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ - long timeout_ms, /* see above */ - void *userp); /* private callback - pointer */ - -CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, - int *running_handles); - -CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, - curl_socket_t s, - int ev_bitmask, - int *running_handles); - -CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, - int *running_handles); - -#ifndef CURL_ALLOW_OLD_MULTI_SOCKET -/* This macro below was added in 7.16.3 to push users who recompile to use - the new curl_multi_socket_action() instead of the old curl_multi_socket() -*/ -#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) -#endif - -/* - * Name: curl_multi_timeout() - * - * Desc: Returns the maximum number of milliseconds the app is allowed to - * wait before curl_multi_socket() or curl_multi_perform() must be - * called (to allow libcurl's timed events to take place). - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, - long *milliseconds); - -#undef CINIT /* re-using the same name as in curl.h */ - -#ifdef CURL_ISOCPP -#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num -#else -/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ -#define LONG CURLOPTTYPE_LONG -#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT -#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT -#define OFF_T CURLOPTTYPE_OFF_T -#define CINIT(name,type,number) CURLMOPT_/**/name = type + number -#endif - -typedef enum { - /* This is the socket callback function pointer */ - CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), - - /* This is the argument passed to the socket callback */ - CINIT(SOCKETDATA, OBJECTPOINT, 2), - - /* set to 1 to enable pipelining for this multi handle */ - CINIT(PIPELINING, LONG, 3), - - /* This is the timer callback function pointer */ - CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), - - /* This is the argument passed to the timer callback */ - CINIT(TIMERDATA, OBJECTPOINT, 5), - - /* maximum number of entries in the connection cache */ - CINIT(MAXCONNECTS, LONG, 6), - - /* maximum number of (pipelining) connections to one host */ - CINIT(MAX_HOST_CONNECTIONS, LONG, 7), - - /* maximum number of requests in a pipeline */ - CINIT(MAX_PIPELINE_LENGTH, LONG, 8), - - /* a connection with a content-length longer than this - will not be considered for pipelining */ - CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9), - - /* a connection with a chunk length longer than this - will not be considered for pipelining */ - CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10), - - /* a list of site names(+port) that are blacklisted from - pipelining */ - CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11), - - /* a list of server types that are blacklisted from - pipelining */ - CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12), - - /* maximum number of open connections in total */ - CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13), - - /* This is the server push callback function pointer */ - CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14), - - /* This is the argument passed to the server push callback */ - CINIT(PUSHDATA, OBJECTPOINT, 15), - - CURLMOPT_LASTENTRY /* the last unused */ -} CURLMoption; - - -/* - * Name: curl_multi_setopt() - * - * Desc: Sets options for the multi handle. - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, - CURLMoption option, ...); - - -/* - * Name: curl_multi_assign() - * - * Desc: This function sets an association in the multi handle between the - * given socket and a private pointer of the application. This is - * (only) useful for curl_multi_socket uses. - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, - curl_socket_t sockfd, void *sockp); - - -/* - * Name: curl_push_callback - * - * Desc: This callback gets called when a new stream is being pushed by the - * server. It approves or denies the new stream. - * - * Returns: CURL_PUSH_OK or CURL_PUSH_DENY. - */ -#define CURL_PUSH_OK 0 -#define CURL_PUSH_DENY 1 - -struct curl_pushheaders; /* forward declaration only */ - -CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, - size_t num); -CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, - const char *name); - -typedef int (*curl_push_callback)(CURL *parent, - CURL *easy, - size_t num_headers, - struct curl_pushheaders *headers, - void *userp); - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -#endif diff --git a/extern/libcurl/include/curl/stdcheaders.h b/extern/libcurl/include/curl/stdcheaders.h deleted file mode 100644 index 027b6f4211..0000000000 --- a/extern/libcurl/include/curl/stdcheaders.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __STDC_HEADERS_H -#define __STDC_HEADERS_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -#include - -size_t fread(void *, size_t, size_t, FILE *); -size_t fwrite(const void *, size_t, size_t, FILE *); - -int strcasecmp(const char *, const char *); -int strncasecmp(const char *, const char *, size_t); - -#endif /* __STDC_HEADERS_H */ diff --git a/extern/libcurl/include/curl/system.h b/extern/libcurl/include/curl/system.h deleted file mode 100644 index ed3a55c954..0000000000 --- a/extern/libcurl/include/curl/system.h +++ /dev/null @@ -1,484 +0,0 @@ -#ifndef __CURL_SYSTEM_H -#define __CURL_SYSTEM_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* - * This header is supposed to eventually replace curlbuild.h. This little one - * is still learning. During the experimental phase, this header files - * defines symbols using the prefixes CURLSYS_ or curlsys_. When we feel - * confident enough, we replace curlbuild.h with this file and rename all - * prefixes to CURL_ and curl_. - */ - -/* - * Try to keep one section per platform, compiler and architecture, otherwise, - * if an existing section is reused for a different one and later on the - * original is adjusted, probably the piggybacking one can be adversely - * changed. - * - * In order to differentiate between platforms/compilers/architectures use - * only compiler built in predefined preprocessor symbols. - * - * curl_off_t - * ---------- - * - * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit - * wide signed integral data type. The width of this data type must remain - * constant and independent of any possible large file support settings. - * - * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit - * wide signed integral data type if there is no 64-bit type. - * - * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall - * only be violated if off_t is the only 64-bit data type available and the - * size of off_t is independent of large file support settings. Keep your - * build on the safe side avoiding an off_t gating. If you have a 64-bit - * off_t then take for sure that another 64-bit data type exists, dig deeper - * and you will find it. - * - */ - -#if defined(__DJGPP__) || defined(__GO32__) -# if defined(__DJGPP__) && (__DJGPP__ > 1) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SALFORDC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__BORLANDC__) -# if (__BORLANDC__ < 0x520) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TURBOC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__WATCOMC__) -# if defined(__386__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__POCC__) -# if (__POCC__ < 280) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# elif defined(_MSC_VER) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__LCC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SYMBIAN32__) -# if defined(__EABI__) /* Treat all ARM compilers equally */ -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__CW32__) -# pragma longlong on -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__VC32__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MWERKS__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(_WIN32_WCE) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MINGW32__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_WS2TCPIP_H 1 - -#elif defined(__VMS) -# if defined(__VAX) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__OS400__) -# if defined(__ILEC400__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__MVS__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURLSYS_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURLSYS_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__370__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURLSYS_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURLSYS_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(TPF) -# define CURLSYS_SIZEOF_LONG 8 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TINYC__) /* also known as tcc */ - -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 - -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ - -#elif defined(__GNUC__) -# if !defined(__LP64__) && (defined(__ILP32__) || \ - defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ - defined(__sparc__) || defined(__mips__) || defined(__sh__)) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) -# define CURLSYS_SIZEOF_LONG 8 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 - -#else -/* generic "safe guess" on old 32 bit style */ -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -#endif - -/* CURLSYS_PULL_WS2TCPIP_H is defined above when inclusion of header file */ -/* ws2tcpip.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_WS2TCPIP_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#endif - -/* CURLSYS_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_SYS_TYPES_H -# include -#endif - -/* CURLSYS_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_SYS_SOCKET_H -# include -#endif - -/* Data type definition of curl_socklen_t. */ -#ifdef CURLSYS_TYPEOF_CURL_SOCKLEN_T - typedef CURLSYS_TYPEOF_CURL_SOCKLEN_T curlsys_socklen_t; -#endif - -/* Data type definition of curl_off_t. */ - -#ifdef CURLSYS_TYPEOF_CURL_OFF_T - typedef CURLSYS_TYPEOF_CURL_OFF_T curlsys_off_t; -#endif - -#endif /* __CURL_SYSTEM_H */ - diff --git a/extern/libcurl/include/curl/typecheck-gcc.h b/extern/libcurl/include/curl/typecheck-gcc.h deleted file mode 100644 index 10b5de2ab1..0000000000 --- a/extern/libcurl/include/curl/typecheck-gcc.h +++ /dev/null @@ -1,668 +0,0 @@ -#ifndef __CURL_TYPECHECK_GCC_H -#define __CURL_TYPECHECK_GCC_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://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. - * - ***************************************************************************/ - -/* wraps curl_easy_setopt() with typechecking */ - -/* To add a new kind of warning, add an - * if(_curl_is_sometype_option(_curl_opt)) - * if(!_curl_is_sometype(value)) - * _curl_easy_setopt_err_sometype(); - * block and define _curl_is_sometype_option, _curl_is_sometype and - * _curl_easy_setopt_err_sometype below - * - * NOTE: We use two nested 'if' statements here instead of the && operator, in - * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x - * when compiling with -Wlogical-op. - * - * To add an option that uses the same type as an existing option, you'll just - * need to extend the appropriate _curl_*_option macro - */ -#define curl_easy_setopt(handle, option, value) \ -__extension__ ({ \ - __typeof__(option) _curl_opt = option; \ - if(__builtin_constant_p(_curl_opt)) { \ - if(_curl_is_long_option(_curl_opt)) \ - if(!_curl_is_long(value)) \ - _curl_easy_setopt_err_long(); \ - if(_curl_is_off_t_option(_curl_opt)) \ - if(!_curl_is_off_t(value)) \ - _curl_easy_setopt_err_curl_off_t(); \ - if(_curl_is_string_option(_curl_opt)) \ - if(!_curl_is_string(value)) \ - _curl_easy_setopt_err_string(); \ - if(_curl_is_write_cb_option(_curl_opt)) \ - if(!_curl_is_write_cb(value)) \ - _curl_easy_setopt_err_write_callback(); \ - if((_curl_opt) == CURLOPT_READFUNCTION) \ - if(!_curl_is_read_cb(value)) \ - _curl_easy_setopt_err_read_cb(); \ - if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ - if(!_curl_is_ioctl_cb(value)) \ - _curl_easy_setopt_err_ioctl_cb(); \ - if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ - if(!_curl_is_sockopt_cb(value)) \ - _curl_easy_setopt_err_sockopt_cb(); \ - if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ - if(!_curl_is_opensocket_cb(value)) \ - _curl_easy_setopt_err_opensocket_cb(); \ - if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ - if(!_curl_is_progress_cb(value)) \ - _curl_easy_setopt_err_progress_cb(); \ - if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ - if(!_curl_is_debug_cb(value)) \ - _curl_easy_setopt_err_debug_cb(); \ - if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ - if(!_curl_is_ssl_ctx_cb(value)) \ - _curl_easy_setopt_err_ssl_ctx_cb(); \ - if(_curl_is_conv_cb_option(_curl_opt)) \ - if(!_curl_is_conv_cb(value)) \ - _curl_easy_setopt_err_conv_cb(); \ - if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ - if(!_curl_is_seek_cb(value)) \ - _curl_easy_setopt_err_seek_cb(); \ - if(_curl_is_cb_data_option(_curl_opt)) \ - if(!_curl_is_cb_data(value)) \ - _curl_easy_setopt_err_cb_data(); \ - if((_curl_opt) == CURLOPT_ERRORBUFFER) \ - if(!_curl_is_error_buffer(value)) \ - _curl_easy_setopt_err_error_buffer(); \ - if((_curl_opt) == CURLOPT_STDERR) \ - if(!_curl_is_FILE(value)) \ - _curl_easy_setopt_err_FILE(); \ - if(_curl_is_postfields_option(_curl_opt)) \ - if(!_curl_is_postfields(value)) \ - _curl_easy_setopt_err_postfields(); \ - if((_curl_opt) == CURLOPT_HTTPPOST) \ - if(!_curl_is_arr((value), struct curl_httppost)) \ - _curl_easy_setopt_err_curl_httpost(); \ - if(_curl_is_slist_option(_curl_opt)) \ - if(!_curl_is_arr((value), struct curl_slist)) \ - _curl_easy_setopt_err_curl_slist(); \ - if((_curl_opt) == CURLOPT_SHARE) \ - if(!_curl_is_ptr((value), CURLSH)) \ - _curl_easy_setopt_err_CURLSH(); \ - } \ - curl_easy_setopt(handle, _curl_opt, value); \ -}) - -/* wraps curl_easy_getinfo() with typechecking */ -/* FIXME: don't allow const pointers */ -#define curl_easy_getinfo(handle, info, arg) \ -__extension__ ({ \ - __typeof__(info) _curl_info = info; \ - if(__builtin_constant_p(_curl_info)) { \ - if(_curl_is_string_info(_curl_info)) \ - if(!_curl_is_arr((arg), char *)) \ - _curl_easy_getinfo_err_string(); \ - if(_curl_is_long_info(_curl_info)) \ - if(!_curl_is_arr((arg), long)) \ - _curl_easy_getinfo_err_long(); \ - if(_curl_is_double_info(_curl_info)) \ - if(!_curl_is_arr((arg), double)) \ - _curl_easy_getinfo_err_double(); \ - if(_curl_is_slist_info(_curl_info)) \ - if(!_curl_is_arr((arg), struct curl_slist *)) \ - _curl_easy_getinfo_err_curl_slist(); \ - if(_curl_is_tlssessioninfo_info(_curl_info)) \ - if(!_curl_is_arr((arg), struct curl_tlssessioninfo *)) \ - _curl_easy_getinfo_err_curl_tlssesssioninfo(); \ - if(_curl_is_certinfo_info(_curl_info)) \ - if(!_curl_is_arr((arg), struct curl_certinfo *)) \ - _curl_easy_getinfo_err_curl_certinfo(); \ - if(_curl_is_socket_info(_curl_info)) \ - if(!_curl_is_arr((arg), curl_socket_t)) \ - _curl_easy_getinfo_err_curl_socket(); \ - } \ - curl_easy_getinfo(handle, _curl_info, arg); \ -}) - -/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), - * for now just make sure that the functions are called with three - * arguments - */ -#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) -#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) - - -/* the actual warnings, triggered by calling the _curl_easy_setopt_err* - * functions */ - -/* To define a new warning, use _CURL_WARNING(identifier, "message") */ -#define _CURL_WARNING(id, message) \ - static void __attribute__((__warning__(message))) \ - __attribute__((__unused__)) __attribute__((__noinline__)) \ - id(void) { __asm__(""); } - -_CURL_WARNING(_curl_easy_setopt_err_long, - "curl_easy_setopt expects a long argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, - "curl_easy_setopt expects a curl_off_t argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_string, - "curl_easy_setopt expects a " - "string ('char *' or char[]) argument for this option" - ) -_CURL_WARNING(_curl_easy_setopt_err_write_callback, - "curl_easy_setopt expects a curl_write_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_read_cb, - "curl_easy_setopt expects a curl_read_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, - "curl_easy_setopt expects a curl_ioctl_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, - "curl_easy_setopt expects a curl_sockopt_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, - "curl_easy_setopt expects a " - "curl_opensocket_callback argument for this option" - ) -_CURL_WARNING(_curl_easy_setopt_err_progress_cb, - "curl_easy_setopt expects a curl_progress_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_debug_cb, - "curl_easy_setopt expects a curl_debug_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, - "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_conv_cb, - "curl_easy_setopt expects a curl_conv_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_seek_cb, - "curl_easy_setopt expects a curl_seek_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_cb_data, - "curl_easy_setopt expects a " - "private data pointer as argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_error_buffer, - "curl_easy_setopt expects a " - "char buffer of CURL_ERROR_SIZE as argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_FILE, - "curl_easy_setopt expects a 'FILE *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_postfields, - "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, - "curl_easy_setopt expects a 'struct curl_httppost *' " - "argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_slist, - "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_CURLSH, - "curl_easy_setopt expects a CURLSH* argument for this option") - -_CURL_WARNING(_curl_easy_getinfo_err_string, - "curl_easy_getinfo expects a pointer to 'char *' for this info") -_CURL_WARNING(_curl_easy_getinfo_err_long, - "curl_easy_getinfo expects a pointer to long for this info") -_CURL_WARNING(_curl_easy_getinfo_err_double, - "curl_easy_getinfo expects a pointer to double for this info") -_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, - "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") -_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo, - "curl_easy_getinfo expects a pointer to " - "'struct curl_tlssessioninfo *' for this info") -_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo, - "curl_easy_getinfo expects a pointer to " - "'struct curl_certinfo *' for this info") -_CURL_WARNING(_curl_easy_getinfo_err_curl_socket, - "curl_easy_getinfo expects a pointer to curl_socket_t for this info") - -/* groups of curl_easy_setops options that take the same type of argument */ - -/* To add a new option to one of the groups, just add - * (option) == CURLOPT_SOMETHING - * to the or-expression. If the option takes a long or curl_off_t, you don't - * have to do anything - */ - -/* evaluates to true if option takes a long argument */ -#define _curl_is_long_option(option) \ - (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) - -#define _curl_is_off_t_option(option) \ - ((option) > CURLOPTTYPE_OFF_T) - -/* evaluates to true if option takes a char* argument */ -#define _curl_is_string_option(option) \ - ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ - (option) == CURLOPT_ACCEPT_ENCODING || \ - (option) == CURLOPT_CAINFO || \ - (option) == CURLOPT_CAPATH || \ - (option) == CURLOPT_COOKIE || \ - (option) == CURLOPT_COOKIEFILE || \ - (option) == CURLOPT_COOKIEJAR || \ - (option) == CURLOPT_COOKIELIST || \ - (option) == CURLOPT_CRLFILE || \ - (option) == CURLOPT_CUSTOMREQUEST || \ - (option) == CURLOPT_DEFAULT_PROTOCOL || \ - (option) == CURLOPT_DNS_INTERFACE || \ - (option) == CURLOPT_DNS_LOCAL_IP4 || \ - (option) == CURLOPT_DNS_LOCAL_IP6 || \ - (option) == CURLOPT_DNS_SERVERS || \ - (option) == CURLOPT_EGDSOCKET || \ - (option) == CURLOPT_FTPPORT || \ - (option) == CURLOPT_FTP_ACCOUNT || \ - (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ - (option) == CURLOPT_INTERFACE || \ - (option) == CURLOPT_ISSUERCERT || \ - (option) == CURLOPT_KEYPASSWD || \ - (option) == CURLOPT_KRBLEVEL || \ - (option) == CURLOPT_LOGIN_OPTIONS || \ - (option) == CURLOPT_MAIL_AUTH || \ - (option) == CURLOPT_MAIL_FROM || \ - (option) == CURLOPT_NETRC_FILE || \ - (option) == CURLOPT_NOPROXY || \ - (option) == CURLOPT_PASSWORD || \ - (option) == CURLOPT_PINNEDPUBLICKEY || \ - (option) == CURLOPT_PRE_PROXY || \ - (option) == CURLOPT_PROXY || \ - (option) == CURLOPT_PROXYPASSWORD || \ - (option) == CURLOPT_PROXYUSERNAME || \ - (option) == CURLOPT_PROXYUSERPWD || \ - (option) == CURLOPT_PROXY_CAINFO || \ - (option) == CURLOPT_PROXY_CAPATH || \ - (option) == CURLOPT_PROXY_CRLFILE || \ - (option) == CURLOPT_PROXY_KEYPASSWD || \ - (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ - (option) == CURLOPT_PROXY_SERVICE_NAME || \ - (option) == CURLOPT_PROXY_SSLCERT || \ - (option) == CURLOPT_PROXY_SSLCERTTYPE || \ - (option) == CURLOPT_PROXY_SSLKEY || \ - (option) == CURLOPT_PROXY_SSLKEYTYPE || \ - (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \ - (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \ - (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \ - (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \ - (option) == CURLOPT_RANDOM_FILE || \ - (option) == CURLOPT_RANGE || \ - (option) == CURLOPT_REFERER || \ - (option) == CURLOPT_RTSP_SESSION_ID || \ - (option) == CURLOPT_RTSP_STREAM_URI || \ - (option) == CURLOPT_RTSP_TRANSPORT || \ - (option) == CURLOPT_SERVICE_NAME || \ - (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ - (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ - (option) == CURLOPT_SSH_KNOWNHOSTS || \ - (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ - (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ - (option) == CURLOPT_SSLCERT || \ - (option) == CURLOPT_SSLCERTTYPE || \ - (option) == CURLOPT_SSLENGINE || \ - (option) == CURLOPT_SSLKEY || \ - (option) == CURLOPT_SSLKEYTYPE || \ - (option) == CURLOPT_SSL_CIPHER_LIST || \ - (option) == CURLOPT_TLSAUTH_PASSWORD || \ - (option) == CURLOPT_TLSAUTH_TYPE || \ - (option) == CURLOPT_TLSAUTH_USERNAME || \ - (option) == CURLOPT_UNIX_SOCKET_PATH || \ - (option) == CURLOPT_URL || \ - (option) == CURLOPT_USERAGENT || \ - (option) == CURLOPT_USERNAME || \ - (option) == CURLOPT_USERPWD || \ - (option) == CURLOPT_XOAUTH2_BEARER || \ - 0) - -/* evaluates to true if option takes a curl_write_callback argument */ -#define _curl_is_write_cb_option(option) \ - ((option) == CURLOPT_HEADERFUNCTION || \ - (option) == CURLOPT_WRITEFUNCTION) - -/* evaluates to true if option takes a curl_conv_callback argument */ -#define _curl_is_conv_cb_option(option) \ - ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) - -/* evaluates to true if option takes a data argument to pass to a callback */ -#define _curl_is_cb_data_option(option) \ - ((option) == CURLOPT_CHUNK_DATA || \ - (option) == CURLOPT_CLOSESOCKETDATA || \ - (option) == CURLOPT_DEBUGDATA || \ - (option) == CURLOPT_FNMATCH_DATA || \ - (option) == CURLOPT_HEADERDATA || \ - (option) == CURLOPT_INTERLEAVEDATA || \ - (option) == CURLOPT_IOCTLDATA || \ - (option) == CURLOPT_OPENSOCKETDATA || \ - (option) == CURLOPT_PRIVATE || \ - (option) == CURLOPT_PROGRESSDATA || \ - (option) == CURLOPT_READDATA || \ - (option) == CURLOPT_SEEKDATA || \ - (option) == CURLOPT_SOCKOPTDATA || \ - (option) == CURLOPT_SSH_KEYDATA || \ - (option) == CURLOPT_SSL_CTX_DATA || \ - (option) == CURLOPT_WRITEDATA || \ - 0) - -/* evaluates to true if option takes a POST data argument (void* or char*) */ -#define _curl_is_postfields_option(option) \ - ((option) == CURLOPT_POSTFIELDS || \ - (option) == CURLOPT_COPYPOSTFIELDS || \ - 0) - -/* evaluates to true if option takes a struct curl_slist * argument */ -#define _curl_is_slist_option(option) \ - ((option) == CURLOPT_HTTP200ALIASES || \ - (option) == CURLOPT_HTTPHEADER || \ - (option) == CURLOPT_MAIL_RCPT || \ - (option) == CURLOPT_POSTQUOTE || \ - (option) == CURLOPT_PREQUOTE || \ - (option) == CURLOPT_PROXYHEADER || \ - (option) == CURLOPT_QUOTE || \ - (option) == CURLOPT_RESOLVE || \ - (option) == CURLOPT_TELNETOPTIONS || \ - 0) - -/* groups of curl_easy_getinfo infos that take the same type of argument */ - -/* evaluates to true if info expects a pointer to char * argument */ -#define _curl_is_string_info(info) \ - (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) - -/* evaluates to true if info expects a pointer to long argument */ -#define _curl_is_long_info(info) \ - (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) - -/* evaluates to true if info expects a pointer to double argument */ -#define _curl_is_double_info(info) \ - (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) - -/* true if info expects a pointer to struct curl_slist * argument */ -#define _curl_is_slist_info(info) \ - (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST)) - -/* true if info expects a pointer to struct curl_tlssessioninfo * argument */ -#define _curl_is_tlssessioninfo_info(info) \ - (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION)) - -/* true if info expects a pointer to struct curl_certinfo * argument */ -#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO) - -/* true if info expects a pointer to struct curl_socket_t argument */ -#define _curl_is_socket_info(info) \ - (CURLINFO_SOCKET < (info)) - - -/* typecheck helpers -- check whether given expression has requested type*/ - -/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, - * otherwise define a new macro. Search for __builtin_types_compatible_p - * in the GCC manual. - * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is - * the actual expression passed to the curl_easy_setopt macro. This - * means that you can only apply the sizeof and __typeof__ operators, no - * == or whatsoever. - */ - -/* XXX: should evaluate to true iff expr is a pointer */ -#define _curl_is_any_ptr(expr) \ - (sizeof(expr) == sizeof(void *)) - -/* evaluates to true if expr is NULL */ -/* XXX: must not evaluate expr, so this check is not accurate */ -#define _curl_is_NULL(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) - -/* evaluates to true if expr is type*, const type* or NULL */ -#define _curl_is_ptr(expr, type) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), type *) || \ - __builtin_types_compatible_p(__typeof__(expr), const type *)) - -/* evaluates to true if expr is one of type[], type*, NULL or const type* */ -#define _curl_is_arr(expr, type) \ - (_curl_is_ptr((expr), type) || \ - __builtin_types_compatible_p(__typeof__(expr), type [])) - -/* evaluates to true if expr is a string */ -#define _curl_is_string(expr) \ - (_curl_is_arr((expr), char) || \ - _curl_is_arr((expr), signed char) || \ - _curl_is_arr((expr), unsigned char)) - -/* evaluates to true if expr is a long (no matter the signedness) - * XXX: for now, int is also accepted (and therefore short and char, which - * are promoted to int when passed to a variadic function) */ -#define _curl_is_long(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), long) || \ - __builtin_types_compatible_p(__typeof__(expr), signed long) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ - __builtin_types_compatible_p(__typeof__(expr), int) || \ - __builtin_types_compatible_p(__typeof__(expr), signed int) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ - __builtin_types_compatible_p(__typeof__(expr), short) || \ - __builtin_types_compatible_p(__typeof__(expr), signed short) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ - __builtin_types_compatible_p(__typeof__(expr), char) || \ - __builtin_types_compatible_p(__typeof__(expr), signed char) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned char)) - -/* evaluates to true if expr is of type curl_off_t */ -#define _curl_is_off_t(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) - -/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ -/* XXX: also check size of an char[] array? */ -#define _curl_is_error_buffer(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), char *) || \ - __builtin_types_compatible_p(__typeof__(expr), char[])) - -/* evaluates to true if expr is of type (const) void* or (const) FILE* */ -#if 0 -#define _curl_is_cb_data(expr) \ - (_curl_is_ptr((expr), void) || \ - _curl_is_ptr((expr), FILE)) -#else /* be less strict */ -#define _curl_is_cb_data(expr) \ - _curl_is_any_ptr(expr) -#endif - -/* evaluates to true if expr is of type FILE* */ -#define _curl_is_FILE(expr) \ - (_curl_is_NULL(expr) || \ - (__builtin_types_compatible_p(__typeof__(expr), FILE *))) - -/* evaluates to true if expr can be passed as POST data (void* or char*) */ -#define _curl_is_postfields(expr) \ - (_curl_is_ptr((expr), void) || \ - _curl_is_arr((expr), char)) - -/* FIXME: the whole callback checking is messy... - * The idea is to tolerate char vs. void and const vs. not const - * pointers in arguments at least - */ -/* helper: __builtin_types_compatible_p distinguishes between functions and - * function pointers, hide it */ -#define _curl_callback_compatible(func, type) \ - (__builtin_types_compatible_p(__typeof__(func), type) || \ - __builtin_types_compatible_p(__typeof__(func) *, type)) - -/* evaluates to true if expr is of type curl_read_callback or "similar" */ -#define _curl_is_read_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), __typeof__(fread) *) || \ - _curl_callback_compatible((expr), curl_read_callback) || \ - _curl_callback_compatible((expr), _curl_read_callback1) || \ - _curl_callback_compatible((expr), _curl_read_callback2) || \ - _curl_callback_compatible((expr), _curl_read_callback3) || \ - _curl_callback_compatible((expr), _curl_read_callback4) || \ - _curl_callback_compatible((expr), _curl_read_callback5) || \ - _curl_callback_compatible((expr), _curl_read_callback6)) -typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *); -typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *); -typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *); -typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *); -typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *); -typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_write_callback or "similar" */ -#define _curl_is_write_cb(expr) \ - (_curl_is_read_cb(expr) || \ - _curl_callback_compatible((expr), __typeof__(fwrite) *) || \ - _curl_callback_compatible((expr), curl_write_callback) || \ - _curl_callback_compatible((expr), _curl_write_callback1) || \ - _curl_callback_compatible((expr), _curl_write_callback2) || \ - _curl_callback_compatible((expr), _curl_write_callback3) || \ - _curl_callback_compatible((expr), _curl_write_callback4) || \ - _curl_callback_compatible((expr), _curl_write_callback5) || \ - _curl_callback_compatible((expr), _curl_write_callback6)) -typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *); -typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t, - const void *); -typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *); -typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *); -typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t, - const void *); -typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ -#define _curl_is_ioctl_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_ioctl_callback) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback4)) -typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *); -typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *); -typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *); -typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *); - -/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ -#define _curl_is_sockopt_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_sockopt_callback) || \ - _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ - _curl_callback_compatible((expr), _curl_sockopt_callback2)) -typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); -typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t, - curlsocktype); - -/* evaluates to true if expr is of type curl_opensocket_callback or - "similar" */ -#define _curl_is_opensocket_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_opensocket_callback) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback4)) -typedef curl_socket_t (*_curl_opensocket_callback1) - (void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback2) - (void *, curlsocktype, const struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback3) - (const void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback4) - (const void *, curlsocktype, const struct curl_sockaddr *); - -/* evaluates to true if expr is of type curl_progress_callback or "similar" */ -#define _curl_is_progress_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_progress_callback) || \ - _curl_callback_compatible((expr), _curl_progress_callback1) || \ - _curl_callback_compatible((expr), _curl_progress_callback2)) -typedef int (*_curl_progress_callback1)(void *, - double, double, double, double); -typedef int (*_curl_progress_callback2)(const void *, - double, double, double, double); - -/* evaluates to true if expr is of type curl_debug_callback or "similar" */ -#define _curl_is_debug_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_debug_callback) || \ - _curl_callback_compatible((expr), _curl_debug_callback1) || \ - _curl_callback_compatible((expr), _curl_debug_callback2) || \ - _curl_callback_compatible((expr), _curl_debug_callback3) || \ - _curl_callback_compatible((expr), _curl_debug_callback4) || \ - _curl_callback_compatible((expr), _curl_debug_callback5) || \ - _curl_callback_compatible((expr), _curl_debug_callback6) || \ - _curl_callback_compatible((expr), _curl_debug_callback7) || \ - _curl_callback_compatible((expr), _curl_debug_callback8)) -typedef int (*_curl_debug_callback1) (CURL *, - curl_infotype, char *, size_t, void *); -typedef int (*_curl_debug_callback2) (CURL *, - curl_infotype, char *, size_t, const void *); -typedef int (*_curl_debug_callback3) (CURL *, - curl_infotype, const char *, size_t, void *); -typedef int (*_curl_debug_callback4) (CURL *, - curl_infotype, const char *, size_t, const void *); -typedef int (*_curl_debug_callback5) (CURL *, - curl_infotype, unsigned char *, size_t, void *); -typedef int (*_curl_debug_callback6) (CURL *, - curl_infotype, unsigned char *, size_t, const void *); -typedef int (*_curl_debug_callback7) (CURL *, - curl_infotype, const unsigned char *, size_t, void *); -typedef int (*_curl_debug_callback8) (CURL *, - curl_infotype, const unsigned char *, size_t, const void *); - -/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ -/* this is getting even messier... */ -#define _curl_is_ssl_ctx_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_ssl_ctx_callback) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) -typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *); -typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *, - const void *); -#ifdef HEADER_SSL_H -/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX - * this will of course break if we're included before OpenSSL headers... - */ -typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); -typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); -typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); -typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, - const void *); -#else -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; -#endif - -/* evaluates to true if expr is of type curl_conv_callback or "similar" */ -#define _curl_is_conv_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_conv_callback) || \ - _curl_callback_compatible((expr), _curl_conv_callback1) || \ - _curl_callback_compatible((expr), _curl_conv_callback2) || \ - _curl_callback_compatible((expr), _curl_conv_callback3) || \ - _curl_callback_compatible((expr), _curl_conv_callback4)) -typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); -typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); -typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); -typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); - -/* evaluates to true if expr is of type curl_seek_callback or "similar" */ -#define _curl_is_seek_cb(expr) \ - (_curl_is_NULL(expr) || \ - _curl_callback_compatible((expr), curl_seek_callback) || \ - _curl_callback_compatible((expr), _curl_seek_callback1) || \ - _curl_callback_compatible((expr), _curl_seek_callback2)) -typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); -typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); - - -#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/extern/libcurl/libs/32bit/libcurl_x86.lib b/extern/libcurl/libs/32bit/libcurl_x86.lib deleted file mode 100644 index ae42bb5be4784d284ab0d1b78db7a624bd925eda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917056 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%0A{2PyUu2f5; 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å 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

s0td|{4w~~EG(HE-`3{=t4w?)H&7}^SDGr($ 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

;B(yAb;Hd!I^&w= zkdsU=xSvQ|Ly9--bjm4o$VsLb{5Bw&o?EWC>nlz?Zk0(!*Jzu^rczApG$ zYcIo-=>`AYm;aHVE;s|)<6Bp-~I@7}qV7r`TdcjROtH0I!oKwyP4mrv6 zg0}$4zH`%}KTLAUndgwB^@7Lz1jO&aIQ4lWtH@Uoe9mM3+it_;7GD=-4mqW&J;(Hm za=}~=pJ~4R{9oVdlvCl5lT0r-H^;ah3)emTic?O&At#w$@cW3wHD=t*&pGADnl&Z8 z-~*Qrx3}$WBbi=set2ZQGN;~#C1-p&*E-}R(+eI3l6~-v3z}|s%BgqANv0S4av)h> zAEbTrW~ZD+hn!@3!TA!&eTjR2b>)ptIg1=}lIaB>2_#D;vHtAE4mrv6f^%%9ORPV8 zDW2HtOX&q?h^dTToKLUp_!+^@S?J&_cW^d4I2{fSb+g(ff7`+Nv4it-2j@=?PL{bS zHOySl7`HvHLIybzq#jv3EEypK@^Sad3JZoYx$j6AsR)?B3$coSx<2 z%yw{^9h|ie&UOc<)4{pJ!TF|x^PuKLH9bGAIp?5M75OL4nPhQ3)SL+xXQY1Zh-z`3 zpgCsNXS(J@HBXzLAxbUGGL31lI6NIeH{asy)toAe^Ht4> zYNvisbG#PjXPOh$GyS~g6j+!)Y0g-Sb6j%_aG;5QL+gf>ZRYzrInW_p#MKG6_tct! zTBWCf^As*}ln&|Xpnh%RaIN;Ljl=ng-wUImxDI>A#^D|aw<@C;uCaJfCd$EL-#Ep_ zVG1W$9NZXQPCVMF?l{50nP%g}zCkx5Wc2-gM%{${h8}03f<%WR#;(uuA_=9tgkjg> ze2ET4j6KxFwzz)R`~>!q%mHMp4n>ST)Fl!MS&ngLC{qVHG4@cGf)myK{89FpJ<+)C z)^QPI4<&nCmYuO*eJ&lvZN~M44n>ST6ld*p7k7B*uAcv!Ks3~!bSPr%p_YLY4Q1D9 zoy$cD95MD#T!lvSW!GsvM~5QD9%{LS;yVtVU8nVBI@EGJv4>g#PPAST)D^Z+XLOAp8Vz-?4n>ST)Jh4Z3(K%;!hS-BBE}wSl`Ss22I9ZyP{i0nwMwXb z_;iPIixj)p4Lp@^}Ex)L05M$@9@r({(6f?4j06D6^LBntB)OP{i0n@rzJxHFJ z!Yw)!G4@a!ZK3SCgm2TKh*6Rr&>S$pc^r3k1-slJPr!m=O1*VXox4J6&7J0h7@fQF z*r9V*xR%acElt#Y3hmUnD{NB}CKUokBaYR%Ysz)#+zr%JH9&J$xt~AquqoA=(NI}a zRaXJ!f%4lA^-Of`Qkbdcu&{nXMQL?lL8TvDjS!owomj3T*2tX0*g;5$0{E4N6E&g}7v_Ub}Gx)U+z~wxMf+n?ja)+btX0 zHm}_nT&??oQ@^bgcvO$ArQbG=uk_o-Fyr;x$|LBv@ zfQztBZU|X)a@$sHG4n+SSn(%`a`7Um2*c_Ve4iZKNGYjcidvO<8rIu>zXU@hRRGY-)LZV|`g^ zbvd;jmRg!MXO%&*YWaNV_T*=KQ}1jnqNu)ML3suBIhF_TMc)>>)?Z&<(^y(v1)Y}| z_s!r5)Ykt0L&0r%LnCzXR{D96z?PAsips{i`2lFmjU)- z2~?i4NhMWzTIsK^DhreaYN6qtl{sTz^`oW!`8B1Lbv0#mfGcD4mX6cd>V!(ve^yUv zjXzM^P+kSe_M;Fd(NuIcv5r>MYHlO1-D`VA|BFGiT29`3j3> z7Ecu}HGh81*!sE0FZmkY$20YMGxl%?mx_F)`k}c_Cxb4D=FivSaQ-BkKkvl~{!)Hl zh0DX`PoVje8w@pL4dX^!bbJ*TjXE)(0LU-Id-I*ZJaanll!^94xQFm;(HSt5Jx*Y9 zWFrv{yUE6CVE(9ae8)`PhzUr)i7;;fcJM!wTec z59+o!Try26x2J%kygL)&;@SaUxxND2-5P6^OU&mfK;+QH4}f_j2A4>q(*$6j0_Lw8 zmxg=EZvuIlXW^qFE;`1WNL~vbj05Hd{Z>90xMcGF0LVUaC1>BXuY)b*R1DIP=z!ZbAWkJ;|A*IPXhDeN#s2Ud4B}v3sac7m~lKo z`W^!235~Pz5tqIrNYHb@9Gs@)jl!Q~<@^oo+&{qGd$?rs7U01_U!hsu(E1A6Q_#&`}Uj^VSc?rtpHekLIkBcjp&p^g^fhn6M;$+@Q z7H<%kof>Dw8z=8Vh`AYl8kbDoWeA@g zzyV2Ibi^f-w-J~dVsMGpC7iDI0P|ywLvoYKdj^RIp{BFmybAkDa#<_8yOy0}DymboAoV-NuznQ=tO##RD@otK^4^zN#9pb8o7vmD8kMm=8 z3OLHkO#w%Fqf)@JT*jq{1J0Y`ZgQ^1V}?z|LmgMh0~0muH(?7%rSDdzxpkpt({ zq|BddtV#iw3*5F8aOuG9P65aLzr88oSkC)Xz%joEQoyl3o=5>V7`VO^aASdcHw7HW ztKkjsVqBvBaSEQFlLC(Un4JP{C~%jgfMdK@rhuCa+{aSDod(?3Q^1`K+)q=$u|EEo z0*>Rx+bQ6fkM~l*ab7r+o3b%3QN0br^FRtXj=PIfz~upVNeZ}J;5Mg#8x7n|Dd5-+ zKA!@P?eBXj;C#S6odS;K_f`tHaln0)0*(zOSx}z@n=V46%txEd)e4f>+EGYq1@un zet`N8<i@*3X)#V=EC(GRAm$1UD( zE$R)6I&M*e5Ke_)oQgV$zV+&p>04h84I0VxtzWFF0C5@n*i2S;2G&IWt%}!G*-eD( zX}FY1a-|Rk8_inPbpRB#Uns@vAK}hxEQ0S7UIbL0P+tP|Aug|>6t6?~PBt{fv3Z4N zM5>CQsAr0)czuF2IJ2WPWmu~F#)@uE!o9}n@Q(@w&)~pGXD$x@3Yt1` zbH7Zk=)}ztvS|s_u4R`Ag4E z#6 zkhsgAHV--jp(h$$HsVFr@umLIl% zAoa^BPEi+t;twIc#x)l2IZ)h>b&E2DAb`9-8J{AR}H ze2hoA(AQi6mNB=|2<4Fx{;v$!rlA;Mw)`pl!AHRbg%Jk6Y_L9-QF7N2jT4)_FIFx=gd?Ic0 z>H8XL&>Lr$xk9G^n~zqiRO{a7g3W>OiLA|&c3k6XTvS;a@~z%+P3Drtp}h8MvZ`ay zENMYo;aOgavmQ2WPNaEm3Zazto$EtPbJIN?SK=Hq~_iBye+^0=MvK}4fH_-m%r{%xiXcPuo5 zqZ~p!9UOFpZG(C`zLbQ&Cn29d+kmsl2rW;*t4+WwcJkgh4m%UVe&aQhvSo4S%QQq` z)*x4iQUe`OKL045u*^Ii50N^N9?EK;TM!)GH%RK{>tOCH@aej_onlno9Lo%zgW3t6 zsge^?Yca$z87~~tP`F;TS3SFoa0bu-mkH-eONXDqv8n=>TShjHVQyn3d}>s48|&cb zFQ9;;jO8lkoT=rg+zaQt9gerDFRy zD3#K`gX)kFAA+KSB(E_M9W5Zd$)Ku)nhJ_%THHnvsA{2#LCqJc1XPVss1<`}v~YuI zevk~C6L6yjRIcRcFmMwfOJ((BC~x5qRNNT&O6QzqRwCbAcU#7I9A+id5|0A7j-)g7 zH_wwacn(y+vc|zz!pAP(h8e$|2t5?QiUzD=VEVP3OOj~aMhQGf`iv+SoD@Jbh>hZ7 zzLZ{!2-J%55~1?JyHu!&pe_@N0r%2_14CRH2$ap@d=9$VTEBecgRZget_IiMtSV~! z5BH=M9H0C5Erp&3-0BsZi;;uDaRD$-u`@$`bN?Qk(SD&XG&KOJc}uz`&zjq}ZBp|h zb9K%Y^J(qZ8@^yxS7qAV?$FT7Tb7~sb+;_TK-rBO{$ZKFi_2@2TGVP#qmW){2$rhy zbi*TS1hzp{|Bb-WIgNcZMU2QE4&jl{ateeoi!0b9))`$}#?tbW-avqA{5+_}9}}5L zgB`))%2bChIBajg6+nr+qx9Nxk@c=#FLjo4xzyt}#G+I9TA$&mIHq9S{x}=S@k-J! z0ks^IS`uH+bizTgB6w;?1qyyK|7OFmQFG+}?O^wWS0Tx+j`xD=Bt5GlPdn^}AelKQ zF%~j9(o@je*cGNxA#E%K^Hk)qzRdmXDY3>s9uM9Y`Q&B5wRHS4I2tqW0d#20;;{G8 z(-~gF0z8Dxi)Fn+GvToI(;dLyXC-U3pj1t@f^vhW>g++>(YcIl3Y0f+)ic9Kvav#$ zh%A4a2JRw%i~NK&?YH`To0;vhl1E_`=cId6Se+!-;d3x*M_8a=o?+WyLDjt(c zZOJHjqG{nGQ@t}Rzy&>A(PAd(?yceilezYE970U2+Q`#fo6kVfP`)F~%0`HNEFcMn zI``~66$pud>P}IrhZ+~g#Np}S;H?rFdHOJ8LDN9$M{9-F&h)QynVM7cZSttaG_T`D zPscrws3tV?EeUx*b|%hl$qt=`wW1eo*@G@Tw*9*7{_{f_doIi7#5%UKD*FvCaT5hT zCwya$5gM;U=SD+k_Eco|i@~hUs+_(Xl7!7YY1rJpvIJp0JAcd~xzUTc{Rf~1j^E2S z#9kN<0n*%A!y45ZzgdAh=gDFr!w4>vEY-AMI4=}PPy?fqv>&O=sswcz$|*c3y`$JI z+U!-^k(X93`uPeQO^U6dL@}s*rD2xM&WAu8bD_J{qOJg?28SMtdf9sVzD3C#EMX_Y z{|7F&7-hNb;4nRMt4@)2zbgXcKHNt(LL0(A z;rhi0t&)XyaOBPxL+G(d- zN|dZi)LW0m=-hQ5CX~+4{1ATcu7mLDI`4WERQLe7#*JrPHz<67Fk_3-@ov^*_P)_z zikVL&I+P)~^oI565JM0RKB7t6YUdT1iTLf_XYUJh2mQ`M-H#S zG36L8x0qymSVHvSUd5J%d+x4yWv~2zJS~7fPIyJ|)wqBFqJ)NjT}HaBxY&Z!ic5CC z@Wfnk=Y!V!HO=h@>d;Az(Dp7dVz|_*Qp|{}Fzw|udLG!d4UniU2Qj4q?eaOU&`@oP zfg+Z5w;$LlvPQhOi;Iv%rZb{uhxU~t3`}XpnpVMW9=KF!6SY3;HCBUnuJEn~^*K;( zgYOqZga^Xlh8>;x4!|==Kn=Z8eH$L<(lf*6(S{#MusNSU<;bDHes_$;yMTS zs>DGU`dBaGa^We?tVH9A+8W}Zp;YZ#BcpV^W!=q@?Ot|zSQ&zWryy26%`hReaFI%< zPK>v21iFrct&M5z;u@L9rj~Vcn&V5WTaFc~Ml*%Ng;xgZyFyiiQdzhd)V;!Mv3MYi zZS>&GY;ky^F$*=MWT~yLNaI*6InRjreUgRPG^&OZdA_eA;>Y+J9Jie&Xa$hC_4?ybta|3NNKdUumgr?|bl$)!Uf zL;`5ZdJ65IWfqN|L%Y`*s)5ryUp5-FTN-qCld{}5P=n5fcr<4WcbsBWJ+T=psuI*! zC4+oXQ<-L8RrMYM^$mG?Ehv@!ouE`$5XKkj!I>tQxTrWu9kaQsI_9pJ+ZecxxxUo` z6PxN<9u`A)4r?LRy}J%_aE0sHwH=g8RsTOdI-}&+eAUuu4k(U>ZX*C+4cTn zLh+ljU#P91q8}4(!X2GyhU;`-^tXu}>(Pvxy6(uvAOF%j4je`mzki~+vuRb=mNk*m z+Wj0#7v1sxanoK7Hp@y?Z(NtD`Xk|c=O_E#!>K#ySqXN_z;njnBUwBQR#tLr}s1vxnGPg&Ya|d{IX~tMKQ>j+Y2si~Q zezc*F$Gz-Vz%G$1Gz{zXjNTpQa9#cW^J5N%Ume}eKt6hKA`pK|kb*diIa#u{T-M!x zpR6A5|#xm%wuy%R#A82ZX_Dp);+N&5#5m zE!kpC7ay#`$6?jIVOjt{miA3emRVrw_zf_3DD;X@hWM>4{F8C%}o>zb1m^7nLbg^Dn5 zT!zmK;r^`9M98KkvcxgNC3aVA5wY1vjmnUYhjLW<40OJ{{$Pw_l zap^Udz*i$Xcb(P1cpa!;<8sS)1Xba;;ht+}d8sr$|Nk-fEr3x~*V<>27y?EUbW~KV zBL)Qtn2-lVz)WT)nMpF442A$I5<@Z}fsmxh1Vm8K5H*fzZLNK2TkX@f-nO>3z7<5l zS6l0~R;#!6T`<0CdrP(Vn*aOu-sd%EMn-LK{|z~_&N|;(`~5ik?7cQ9x@_$TF<2G(~VpZ_t7C_3bsWv}4{!gE%^s@;iG6F*?7=_)uD-xcE@;ZhO( z?J$4ryR5$BwGn+@P?Q+s_~mW!>H0L_&U3fnRTJJIOA4bKrs1b3I$mdtLGjX3Fv^7; zD7iBed*IbPI0+KKP7{O+amtS zyTr$tp(BsXYV*zEgrOE)I%L~^r$L9kB1i}gx5>p?eIMN_iVid@yHcpLhw;NPb73K zv6JdB6}Ukg8{vpVPpA#X0>6~viK~|)EFyu8g(Z2WKM$a6aP*IHFw>5sKiMg=D`W|G zYn-s00F|pf4C+Y1d)mMeeU#v_m46+7xnkx_;@08*FTlFRmpIw$+z*~?vHxLEr(m@5 zXCYez%4{C_l@9+=(x-?@Qw5Cdf>F?2iMz##b%(}Ry0E%~Uu%#+h4bFRxsAgoqjc`e zId@tVpE&fF#6mFmQp_U_^V;s_tI*oLZDuEiR&(z{FlBr|h^1xx)la2gB>hKMLLKk- zyv>(I3^^z@V^~i0aC%*?6h4f+I^$My#Zn$ON|8q_-C2djUt;}2;(Ep$UBmEd_G{5` zUzW&Xz2VAd7k$>`k2uH`XZK}8LTMUVmuW!Bu|Wb61gL9XAehYs_eUpvr#UUc5->%2bsHJNBOWN zp_#~e42yVectV8tBe<7s0Ou0qYeNu}>>WEn{aD~OfHG@?{#_e=BA#j*Q$mg$ISZVV z$iw=Ed)Vr_;lDMUVo>wIb8D5L_`)KZ7i0EGuZ^4o zVmb-v;*heGCUa&IrljqxD`jr|lxK;swR`XuV;Vyp{T4@2Ils zq`*~jWWje_^koI3-$Q8FhK>9kt3aN`4f@qxH<8)w9bY~<@=kui)t|zxIyP{5RQftG zXi(h-wbr0k7*vBnc@3(v>~Cz$raZ_joR~lM14eUVw(3oJcAD?B9 zN$guIqHNCHjO_4g@dHNWxf*CH#&|jqa8X>4Oz*Mg1fHdHXX1g(vn7Ox+~a)lB>vpm zjkt!v%N3^(vINOfJ~_T}Yj@x&bJeZg2a3aOxArI~w!3a|*g9*FTby#p-o`EFlvxkm z;$@OOfLqkEY(cHTwF!S1*y9=z6ia)vpt^BgEvQ~x`PP~%*0U@Z6z8&53F;DD&l42K zjV*%OiR%hM?ZTB~%v>?bWc|<8uESNzBJkSvxWj+^$@Kusa3jW&Iq&z3!qbH$N@#u* z(`^`HrCpqQ4E%coe{ws-n}WhcE8+!CG)MSlt182S2Kl{CJv>8rP0NhF`f&Y<^EGiW zVatl<^J=xa+70d;^{>!sSJyPvM{03fa~`<0tD~)vV67HzY4vHX^#Lu?jPn6o z`(l?2#5&@!P7e$K(++QYyr;jl$PdTeZ+ExVr^tay}xEfZE6-y zNqoO2EY2Q+3}fS&HG625=Pb?N-p6wjWqdqadg9&v!*Nf$XH$Dm@4Eg=7O0r=%tHkg z31C4Yo(p8EFqFRL!1))>9=d4h?4fg=TwO;^G+G-8SdGSmT4It!QJ-so{P|u~YX*ilvc!EI9S<@1W_09Ecn_XX7-g%j> zMdq3%6dxUq4Q}-e#bGjbJ!8&HWz3N+&8;gmE@k8ym&%MYLRjo+?;VV_cW(92uxSjL z+X2(Gou^IHf=JY1Gvm1?+i_~8$n8LVON}pF8_=kFnNb!#_-U3M$!AtJH+n8aCatUq z*9TCTJ+n)zE-WcsSXN$9xoC0KMHgvJGOs;WPQZ+)y&Yl-!u_^N|3wYvV{ zzD^HQa@ezOYdkjOiT8UtkpsQ`?VZ!KRf9e8c&yI~D7M~s+6QBv-dGp(^$&XDgYA7o zU9rJwS{(v`8UkIy8m~tdGrf*1&}MhcE-C9ok!Oa?nY+z1`>cyt$Mk3+yZkHan-_vqNG%T|eFf{?+n9+F9{Jno6;4Ih0bE?d?%mZifS z$jKgtGwXRbZ+c2f;l@~#e1zsf2&{hP;%T;vlPa8G{pqwTFE*t(E}_eHNO5*9+r>#& zQZy~}fAh%WrqrmA z!HCi!l`o_!aAnS2`3&ESTnf!E!gTo#DdtkPixb2w58Foa@sg`c-31QaQ4Xo2!OeE* zV^sTroc}3g4u2r$Htq65dMU*FgOV!1uiaRFq40|(gzog`f3(t+(t}EjEYC9$`0H`U z^iFjkCq{I_W&bvSA(P%Sv%{t1^b>rySPEj_E)Dz>a!l4=|0<=d2lO2)FbsoIqoq5L zb2cy{o&Pj^s#6bN!|jJnxiyB@8XmqgXS+CmFb&jy|9;Os(pPJESf}lJj(6zc_wQ`i zd|VmkSHIYR0Sqat9u9NudS*yH7K=+KIWV~n%*hVSQ4S1Cpxv)24h-K~?3f$}hHqPT z%rplENuPvq9uVpg7|sGQRZe(zIx;6YeNGb?YrcD=UzYMSOJKq%jzypzKP?xDk*w!* zhn`Fhp8=rXO6&Jiz{0j*O!Wa z>x|c2hn_hOJ!c8bCwax+9gj9_bLwF(*u!&{Bkqim9h2wqi={o=bs4U#gZF&%k~*hf z3mkgXft;2+JzHSdIx@^#zx+eAW6611;?Q%pBRr)7!xeI@vA_IHCpxWUJqsOrN*#L2 z1f~I^>^-Yaex=r_r`(~Z%%O*U2YN>6VLRAz(mo_ca(LJq+tay1>any5iyRo|fu)ND z=F_;cg&VvoYpK((DuxQkc^n$hiebjwOEf?C(09dX_o# zq&txF<3KVmLWx%}otB)2)eb%CKu${;^9sxet_;tbPyY2mr=A*tv9>>6N1plw=5$<{ zK5zYW`b$ndeuo~PLl253(vTxX*7w!l8-2*B2gNQaodXU%sB*x330IE8UMYDERX;g> zf(|`(4m}J>wo8v!@k<}S*r})9p(o_f(;zTAaAmwIHaB4UBsn~d4m}MHJz;^l5?78? zs)MIq?bOrc&=Yp(i3rRnuFUtI?7D+aJQAZI_2%!|Ayx234d82lxLM;^#&9V4w0n41s; zrr}L@KXrvOJgXggRyp$Ge1Y-cO81Zcd(m7a$Lj(-v8T`Z4m}qN48P!T+%KE zS>w=ip+gUfCj26jp?Gch^;eyG);jcD^RD$GqT`Vxxwx!LXr(Iyy zLevfF%x!%rEXjJ-IrOwU^mGUe3XP~c=bv;2f|jhO)1jxsp(iFV>2&w7F3OdX(tYfxbfwAV-Mu(nF0#kr1UFrjG`|!kGo;L|Sl<+bdaK~sK;lJG5FL^p=SYg}( z(>65J(cZ^2hkabh!Qqyh`ZqJH;B=`gl$6Q&l!NnS2j>9?hhI{p(>4E>gY$-iqo1H* z`Yyj9QIoFc3?{g6I)@vC?3`K$XO)Aq!NIxQ!TGp@bE|`Mr-SpPgTs-fJ%s<`;LONQ z#>{namN_`}4o<6s)9v6~>EL|c!O@SvHB2j&kB&N~jyG&TXk>G^fCgHz(*)Hyhv z4$fu=XP1NXDF^2(iW5eOl7YQfagH}Qk19^Y;QUN+&Nes)6{pnTysJ3#4GxVd(e)Ud zIf`?Z!C9<0vjoR_An+yw!_QxI=NO!J#R(Z4eN}6N!TF@Zcn!|i6=$)**{e9`8l2}8 zr_SI^D9%!YGpRTg21h?&Hehh(a`*-3GdSlePKUv{P;pinoGpqIGdTM3t*r*<8w%5A za2`~giww>$6{p?cyrno78l0&dl)#;DaL!Pi7K3xH;w(2f`cbIs4bFhV%rH1tDb5)N z=M#!kW^lfwI39!ZeZ`q$aP}yUtb;gexQuUfUKHC|_{|o_5m$nmW95|cO?911V&rke z9AU6!rX+8~odsa-Y>-)3*Jarj=k)vBk0Z-)HdxE{YEJi_U1RN3{5d^sku>C(3HAWNfBe08WK`SKH;|gYQxi})cs0|7`s#)9P=>b)>)NkrDeKf z4Th2;#x6B1q;$XTnBzwc)1?k6DPrtWn{9r5r1&hnX6RDxsdxxSj9qFAIOY+`&p$hY zw+UTJKPHzLyA((1*)G-PXusM!eu630r2HbrF16L>*DF6iWs{TCJ+%q^;jEvsbjS%b(dljW0%@4q)_!NPEU>JloT;`Db6KkyYiJx z&gxIRYx?z?k|M?~b-9o_R!M#Kzusy!rDjZ%Y+~$EoTHEI!hOU1tj!l$~WOK5hDSgOVb~E_J1l((CeKS9OCa^`w#_ z#x6A?r1UggaQ?U7G^JiuQpDJ$b_prHY<%^+OKvlzPB{_};fS$Ip#ULXN~!jvKmH0$ zi=NA?loT;`sjGz4OkC-{zH;<_Q)-)%BE~LtH8|O><0%3+`STTjHKp!UQpDJ$t^vn9 z^7?0yL*F!|-d0k?*rmpVl%5*T-&%mzK|NljDrt$aOI<6Zj>47h`6FL{$&}itq=>Og zCBQL5xbUb|@K*QhdL>1SUFtd^Rg5d$svszlTS#* zuR@Bz*$<-sijpG6F7+93vRx-q1kQdC{ZmSc7`xPG!7)p({Yd$Dl@u{{sm}>1y?%Lv zTizltgm>dDHT^z#Mq^70>{j+C$Bs1+osfal@u{{shfq= zskqYpzA$U9DfM$DMT}kQ3*cnC7E=VSe9ILW$msEMs|+E=F7-ul%y>Q4H3bc=F112Q z5o4G7l91AC%D}#sADdF2P*TL$rEU>Yxwz7OzTk(J5Z4;Yf@QuCA)F?Ol1+N6H? zz?3&lsd^N4zwWE+A;k>&ybz5 zX}CAuBWDA6bhU!5kHv@jJ2vV<{aBu+Xn7L5xgbrk^<%}YtJ2gXV7UY_)|TQK{At@1 z8yad~AJeL<+x*_PlJchJ#z0MdLxY#bMQsQAR`}|%Ix-lFibv`+YH`fHNDf_rzoDVI zvDxP(Q_ABo-roL>_FlxZv!}mJOi{KOC$G0DHjnh~?`zwvrZC%ds!bjB-nI!#1>3r@ z`VOlFRetmgb@r_9iK{yS7#NIUL0K|TJmNAzE0inw?Dt!G`fQx`&Q9f{!VL^qGs{0b z*xLq{<-mFZa1J~Upw}O6PP(VBT;^sXx_XC)x`{GbotA>4D>6!j&e+sH80&10<7|1s z8EPNuZR_Zbwf7C{$_1-4*3sV?Lq@ZFnMkqhu8lEZ$x!)W1z2JwRk!yg6(UoaI04=& ztQR}Q>*?$2*VCj6EB|!5qqhgEDBHGR5uu(n1M3HeT4M2lT4C5?W}14^I>42OPQEVT z$AZOpY*6`Z6S6<*=#F)4v==B@zw}j#N(ItLrlHo>0s0aYfx&oxe^-}Y@NnPJK7?f6 z#GM}?eUIoS-{0(lElDCDnhD~3rl*PXiKx5|T_Q=GU`AYq z)%i@OfRis0AsxG`rw{GA!+V)XY5A$8*a5b+cjzf5s)n_-6)7$oC2QiV1n%q~z#8Tl z7RnlZZ_iNMI;?3P)V%0pVyG}EYi**^qYCzK?1_2Hwd%I!0j|y;YKiv`q962Dm!cy} z-(PvXRo*I9!#g&$_o8Fd?@-9~y5E5oq0?xEJJ9zLr+Ub+HynvX{Q+N-*W7Yo>uJlQ z{^n?-zp>WKrTex=75@5YU2SbN>=oM+?9UnkO*PG-IWds-RvMQUp512quk0(slRMGdvl5cWjWLsaaAusto0)YUadngWep z?vSuODr;&81e*hah!<lf2H6RbTNu#== zy2xKQr2iDv)EFN40^U$fO&yZ3-pfV(`X&w?t0ZkAHQpv)gRiNfwl<}R6}vEil2BhC z2_S$Bf%Tc6W3iAw*br^Y_lCx(PJfmH52@pDz$<4h9ad#8NO&T$>x}n}W5CjYg>DCY5Siu$^fV@%o#B zbzy&FotJxJs;krvndD%F8^WkU^(aj?R9SUJX?1yt4ef98*48!Dha=(Il!2+PP#bHi zE5yzkBY%92USAlcp&=6T>YjpHE)S4PWZ?LY}?+Z7e z-4nZzSVBaLVoMFNDW|$(C~kzHDq7PN3OD&9dJB}IgjCl11O5PjtghI+WA_@|+Qvvz zDA?dtn|egE!BH66{^}AGO}Vc})*ZuVf33H!F;d%D7YKNqK4_ZAXo zcwnG^5Ic{Oi+hc?zOkmZsS$mP(b`pX#`<~ywPuE|!P^-1M+5$5zqiKR%EZK|zzUL% zST8o`*d_elV5BKh<8Ns6)`&ev)w<$x+0u2`@F@JDP_&lW;%#muqAqONz9U6StH?Gt zC*clhP!}=M(O=^Y1|tnkwP@+owx#L{n;LZb2(sL{WD7vEx4y2I%Mj zBu6Xi4P)O}ZJ;si6+4||z_{C~xLLOB(n zc(KA*blT$QkNTUMkg9S=l=Myvx2r2u8>jbaNx5Cw7)5^{jQT_?j^y{(Vat>)d=+RN z>g#+>LDkTws5y(8L%}9A_EAFWMMY*c7D(KonP;9@Dsq$8*IXZL4Aj-J@7DKY*&vIW zYtZV}1nW>^#V#%T(_mwyu_59Qc-7u5`4rOx<|s{!&$P2E7FLvbOjla5u&lJQbW!PI zlSitwq@=R4(&JfFx==m1cv=`=%{G7j@eAH`arcgN3-IRM5!Y8k!5SyncdBQ`&$L2) zrB{p2dltm+^c(f-)e3#qRgh$JKJYI1XLae$$bAmDKPoJLc!nuSLqf#F1`%5bbL(7)U98C|yK!Cd1ppyVWtN>bE;va$+Qs`+!+I#8+C z7_$z%4R7^%)(=_-o<_(rsROfs`vLs>xr!=(($xXlCDGRh689nMz{3#V_3x?!`b^G0 zq5PNau7X{af*W_^XqP-;Vx{}?uAH6N5T7p%ne06UF=dgLlk`k(IyrGIo4S8xWneL| zJ7;BJn3$cj>%+@FSY@COGDatngp<|dEKqHj%o)I?zXMZ2m?n?Ky;zQ12~?} zK}Xf;>dm>pL@c;e=f7VM`PIPCLLeR6nRNOJ@zA3hBE243vz7ArfUKPbOozfzZ908d z0P~5%=qrc(O~CwA;h03}^!*N)zZ^y%3(Eg03`pV9={o`WdZucC_4uNUe2~8PA$WAf zzpLFD;)LFZZ*(@~$)-g=@65Fqy|6Unv)?C@bSw)7&vFtEuicx7-joCQ0TIf=I>j!Oh{5F?gk4LCZ!(Xm;CayB{F;E`CyAs!v@#n^$+~v$)oT4EZGeN^z zs@X8pE)Bzw1!K@;7akxy0rQ%92=+9?7H|#&vzH%crPoXv{<+0@X&z8A30dLjvXnt; z7I0;r6>*!pN*)O|S(&(8nYdahk2uv+ATMzU{=N*qux3m}smP!}2qRSd)lKU%veIA* zQWS-N`D@AOy~OJ6v5PlwAHm=Ht=E?Ah*JfIO(ZMOlAr(M zIj0_u0qo&%Za?OWkGY^{+sHO#S8{kbFtqEDTi3uAsli{Gb&yq=Wr=R8!6}vu3}|(X zPjO_Q&6^7qN19RK%|^xHkJP-?!5Ou2xM)Ux_7crroBkz6dC zZpQriFv*AU7thT)+UCi$Hq#e>q17A1`rw$~jd-ybV1#oK>~+rr$u8TCT}3+8z{mK@ z)mG!mkx#C68Lmb6bBnX;W((d;xN=C~)^5X9K79a`l=z*&10h-r{$^`aIfbEl@MjKI zN+&DjsD#J6i}I=8=GjhnhhaZ;8vNS5tV3tuPoB~uDRwoI0->>0q0@&ir-7cL-AWeH z?qrpA`&HeC$wY(N%M@Z`C{5yXD3>dyUL=qA?14o{jWdtI5RSt{n1);?Zidg>kcEHR z26;#gvJMBVOzGyci6g|%0n#WXU*Ru`O77iksP~FzDu@W}E0a$vK>TG)a}knM$rkjP%LZ1)b7#9P$&^ZGt4t?6p-h`|>x7rZR!>HN&v9M|L|^WNJPYmYA|Dfxs;+bKEL z9*v1^u5vd6payFUqZkTgyV#%E-2zKbmW@Z|3P3xKJpmmtvP0xzOmZd1+S3WHi+vsY zw>b}d9)+7>v<@CwWbA{Z95Hie)x%}RxX7tT4h#$NoIcPgyFHdcAG0sp z#k$9k-Fj%|1x`J3U})9jw7bICWV@KjL_Zl{_p(!u92i>lNV`2;+k}Z+$kA~?M^0bI zfEt~VLwBOM%8TSIaB%7rXPVH%8zhWyc?JiQrNZSHoKGrFuEF`X;>hsu<}nB7MF;1g z!O=^?AqOYhWwPw+MdhHFZ4li}-#QOTDdQ=Rb|9A+yA<)}{*)gt{^`d|sY>M+F?J~~ zgU)st1M7j-ub5KjD=A{^QY_cmE=vRi0vEVz6q}eV?Mt|88*1xD9S(48Jk&M-vJR`F z#*#{x>3bWPscH_w(3dp&=Hp`(2BdJQM&E4P=VyRpk}S*s$JTan1~^8uCIcJ? z8W&`MBV=m^IF8$H$NnK=8Q?fln#%F5#idGTmgfZ-;LZl_f(&pB-&h7X#`lg4aP)U~1~_g?c_Ray zXqGvqx42a4!glD`3~;RH#VK&;l0L|+!Xr?3)xT?2fgcQq#AxJ0Pb*yU>Ya$mt@z_< z8M}(U2O_bn=x+SnL#8+r=l-InK*Cu63bJr0&h1y*3ulqc zdt$sMD|??gcYsgH9%%Y;;xhy$@Yn^`Y8@UfT0LHug}D(=_MY?L+lp@b9@S?*-1rLZ zMGR;vUW43r+!y0_V0>56&63p#au;RrXeptfwWvrMyc)}YSwbrwc5)nz--`*tujKD4 zx(>JWV*jq9YxoEbPkCZ3f5Yltq$40ZanA-6kGA87znsnB?;8Fly!kLA|1_fAy3CzD zRf|WK9m}8KvSaw;jmo(fc{G{`f;tIM(DHNxTuNeLSMHlIhZ^%g>m68Vg)PI4tw=`0>jVd>_yf_1?*! zl|7D<5W=4q-*;wS@vaEA`-*o(xbv@gmjN#rrTs5V4;3S3o1$HauG{63vngH3lw;si zQFKENer7~l_3vG7l(f;`KoF-h73CC+J_k|&k=rHsTWUvkDKBtjP*K6?YThxxfueGF zdV(GguZ#ymzz&58&xV$VU>$oaiRB3|AYg}hhhHy$^=RaacwKM~eB2~hG2*^83wICfri1DuJfFV!jEC)7_lp4Q8 zSgLRmUculEPB5 zP_+*p#1PuTg1{WTo+GU=6^6vNil@+M3&O#xb%hiEky~R1GE8SEm6K0T-YJ46_yPf? z*8H|)C3AQvN5tw*=*!+!besIS89!098YO0|L}NExse6~+e;vU@V9MR~KR9vbPSG>s zhaSk;dEC%bq$u+Ncf0YEjaI^V{FHqB2>B|J?<{&=qE<+h@NDFfB8aC95%P&X(t*51 z5J?HgaN-%mLI;xJp%bZxVqOg1Zov_cMG3~OOq;`WGPM1mI++(hs**19IbJU6?~HxO zAI;Vp4^N?pD=trq($6!>JII-GgeOH0wHZ%P4~u0F)h+MXJ6Rh{_?o7BITHe^dzlGR zb}z#pNp7$7kQ5$V0Myc~_$euyK}`A|JPH5=)!HN7Dbn98QD%+&^gEN2vR{%ITVfQ9 z4!ZQNiIrsW2pfxn(N~cLsC&#_{IK|=+1QC6*=%&8MPfRLF<6nxRlYgO`UM6v9{P~Y z-KnbDJd{k9siZ^%SGExayS{>w9X)shu3$18JiV#Z+O{dMXsT>kp&lIk1^t&ARS~{c zy9T|=t>CNjcc<`gq5?2hOZsuL)eknsvh*Ls?5dWyPK0{-wJy6J={IcB>9X3v$@?v6vojox}+^bJJMlZNj4%L$ipS2ab8+|Clx*I=S zilh#OyW$bnL$Mg>8W8eZSCODD!j-eWZmkbjzJBEj`)V@<^&+lk3hKAG@=e{X%|h;S zdLmaV1;w|vTx}01w|KfA6yMZywWmOxCaC`eb&PoWJg5@E`<21_11P?3=4x+&lA0Hy zh)F7BP~)KZuA8fU4HVx#ah{byy<^~b&aaeR4(d388wFJ;WN!c^eHaAgzOhUg#`5#P*U@EKuIkR8q|}Zq&}{hkksEn)e2eKmXxwn@p>p_j|U}j z3qbh(Pi*1HF%>2^=VLzLdzFG%>d=rzGFPS+o1M=iU{0O zprmjA1!}qA{SFjoCfwQqP}1KSXt7p_r(98SfuPO=wL(zyL0u%MGEh?X0#H)66V%1x z=|)g8RG$VV%f@{M^%GE10^csx(_=wNUXel78&nIZE}{7XP*QW3@pOwpecYhFXi&F- z>JYNu0VUJmIZ!fGe>8B13@R^A56e7ICqdS&H5k-@K@A(YF@yS^LA?b^)~#t6e95|1 zV^AwV^~xB5lA-#j@$|ExWNLg5l&o*R0wv4P??Fk4Nl=4A%Ms`>B<}=JvR=*sC1V)@ zCAEALl+^qns7r+Gqo8D({+ID|DrP6PiKhjiq~_B>N!ccY+GOB{4BU;z({F&fTxj_o zs4E2ZLr}W}^&qIL1@#ChS(=^(H7t0~fs+3I2~@w}y=L$Zfs*O>E~p;yG$&t|I1ZEy zX^}yBL7fO3TP4&U+_6o~(&S-`Tu&+%P;%mCshoGHkn;`;n9wOAB${TqV=BG;9&pYIXt0F zZh9lB4R&neiCSlaY>W-Aiw*V0jpcx@b_wy|Q=X1l zpz%W&(6G*dZ;4`Sy&r}vVwc1%g8V>8%n*)fQy>p_YXgNNLT%r;j1%*O zor#RF@&1jmJ}VMCy<$C^V`&u2P2vkQ?v?Uv!Qp3vu?^T77VE?rXC55w=4om6H?~wD z+_c!>nKOIXGkbV0qrDjsN*7$I)f3-35Hm&0h`v{lRQQ+kNIEk!YT`JYZrw0WU9+TD zXAEmFHudzyJi`oqU;CyQPOr0tS0*HOw~F)WBo1YPJFz{%mX`T7(fS3`w7z}~#zbQ4 zX&6C6#&pT=u!tb;?F!Y7(;;1&C5vm`JOhLMak-5a3T5bJ4yO#d*xc(V44!r)nhUhr zzK+4I1Mwzhm&i;#vzWvr1iMw=yNFnD%#yUF!-CVdS|;Um3PfhPY!Q?}2*hmBvy~?c zSPut|&g)x`Oq(;im&K2VHLCm*$*&oAW=0yUG&$NXcJGR^fJ`*=&jb4^C=H#+NALgT z${x!K7&c_tF1D(l1l95EU(b}UEY=k{7$O0~zKJa*o!m>ez@i5O5n$LnQsYfe`fHqe zFnmbTBbReKSHJ+M(O2DJKno|nvM841%u;un<`I)I`0C`~oa5kx9h{3DoVenc3#yqu z(&>JES=}E2-(`pJeH|jg!#$eDG9Dv@KQ=IO0!h>Oil#dmuRrLw_?4VL+c?%$tyA#C zTyVZ->MzgJWzfkfDPrtvSun_f6myO4lc$_IVM;A^NiH#VDGXa6#eAfD>eT1vnNq8i z6ft%w3{D_LKHZ89m!bogv4X8^B}I%~3c~|PvFE3I`O$~aZR=8>Q&Pm(rBIL|#qY*+ z@7({)Zd2+BB}I%~>L_r`G@QO)d&-nLLU~GzU5f9D*)CKV;im3ckAasS!bOT8#xBLN zrD+*c^IU<<(WUwoL5y9BwJ+Os7Or&9+_-0>DRrBYBE~Mov01jOgd%YF-}S_krqpkg z6ft(GW56+`dVBH_96f|5sgVycb}81*Y!}}c>ApWVf{~LhwL(b|W0&G^OPX4Em#xBJ-eR)bK2yJx9 zok&hSUS+D0BE~MofuU)Y*!PLzTTH19N{Se}6id5lp|$0qf(lb=L`e~2m*Sg_Y@b1B zt;Hi3no@i>rX$8K#c{S7ud{ynT?9vu7vGubh_OrYy~JEOx4HJ3FPl<%syQLXF2%QG zGnYSiV%?Rd)FLHCj9rQ|Fxl9%A>I9vnj1~20VPF@U5a%-+cif?eQ*0gOD^;Mn~oT} zlm{HS5)_2?+m{bknSMR3q=>Ogod%9sm$yZ}_H9#YnrbGAu}jSoQfK2zclYOB`GP6s zS5m~-rA`OOjMrPoFB~wXwkauM>{3NSN>9UkzH?=VDRrlkBE~K?TS)04Y?`+kooE(# zbovPp#Mq_I04LkU_Jr>EiF46B>r%(C3xXrYF2(jU+okvI)27^L@k>7?f*89L^VjSh zd;{(=)309T7cq9Jxk5^BMKAv2v+GQ$Ta*+rGSoa#KzCW%8@N*|HM`@mcV#Zz?2Gqz zi(9eAGM(W?VR5l-ptqft^UT$lSnDg^92HO4V57lG%cd&%UeLB4W<#;0voE&3AMbdy z-iWtASR}MqD5QBsx$qM@-^&P_Wksq8O2#WVeK4#9BU<$hJ}=)Nt1Cp{t6~3$#!z4w zM!x)-467ZJ@`%65@2d;dc==vzTcTM3OGRPW4XaURQ%a>etMuYPZGBU{ucpqcze?LQ z_!_*S=K5%$wlNBGIjLW|K91X*Mo3v9S49}>SZ`imo-@cRVz#tVGntXwJ z*yj=JPgA~@+dT7!ytTo`rbZa+vifDdufxQUdSR!bB-30C?1F{s8p93Eu!Lm^Bwx*7 z%}Hc|^&Q?6Y=n)pI$y0n$;ZPA!t7jAFbvCLNrLKC+Tp3;BLw}Su)nS*=;b>;EN;qybD)S*m7I=`*}F1yRaFO-)S^80tzY?gkiE!So3U zQ?4GSx%|FJZMfgRsO2>swY}nu6TmZHW3|DGLc@MZZ^}_M_c{k;i~9SZfq&IsYO} z0IF`voP=RJl)?}e_6Ss#TekxoZjV6uBDK+2>@?02dj!_wjZ+P>QtmYF)Q1=PZ;Cwv z&*Iq)`g8TmJp!H&wia|BRQ%g4SIM=Yav<}eSA%N*!bvkGy4~@O2xVf?!YU-Z?haQb z$|}k%yU+7QnYeALrp;5jt$X#z;)pvF3pWg2CKhfM19u36*|XK#Eq~JO^Jv1uixiF% zC8_p}dV+OFQ5(&^*6i>rY7yQ(Cd1xgn_o)4#w?9=Ic9P*oi ztIh)f$DefiK8}Z9Qn+;b@WQEm6PR<6XLRqS?_rbC?_9ez4m^1HTLgXuPt6G zV1^%N&b#_Qd?giM->|xNzHU8b^9;E_XL7S!5{b)a8q0q3g$0!tVL^q{H)rB6S1iPk z)Et8cLSx~k(>Eh?Dge8LU(LrdrI{^dFOID#${Cw69w^G=S3i&ON6lPSjirhOqix8l z)>Vn^MTMhS?YabaD`Dwo2wPDmKz4O~J0;6E|fn7wX39auUJ3vAVoOFu!%IE`O}AaDN?Vf3*E| zoZP|>=S(as{OYh5y0u-9D&^W#vF)kc^u^{j(++>dp z%*5K;}y%vwBC}CLs2^*_vim`+j2{t3~Xxl{>!jrv|n`b=0 z!Y<=vWKZ72-7778NKJf0+)vyBn?Lyvyp30DWe*7c&1s`Xsql0tli#$rgW@beuJ)io zJqL>O32yCAxH6k@${+HAb3(b=0#M9cw-yB@ivnkxCB+q6lG+7|Ggh)OVOz!KEJu?k zn{dvD#Urm3$x*nn>~C1U#VBf{uMOv|E!%w&Rut_`)aEBxHn@Cy*E!J8!lb;X5U^DR zrv|W^VdS#B6CPqrHh4C;3Toe0x&A!YBfVI#>jgZS9Jb`7U#Pm93O1-!7GFGlfbyAal- zMD!eC*59(f89G}Ki@EsA6<_;h-tIJbe+0$3$z1Jp zL|5kHSq4>UP;~~?Y*5^(DgjE~ns2qX~h#XjF%4*x&f^^c`9^_jN zif+LwJ;FIK<9Si2~50a~OjjhV-8rw2$j4i^d{a(R5z$YzO9W9gLYEgITHK_Ow=!z*3)iy1sfBhUkIdLB8sC*0PDmk_4>_Ihkb{~T zNMMU5rV!`tW={Do(xIux?*t@f>$kGa2yq|@? zf2Cn9j@s{+8rA|tv=gbm zCl~Xfa&ivXr{CgNa#kyj`DJ*c;_y4L#OzcY(}>q~ienn_`n=-MK$n#IrsA;LO3pnt zPU`Q;)>0*tClOC%xQ4g^3sQm z-qK24n$`vkHf$Y;>1Hcau`JSUu}c)QJGQVLC-DfGo`HqbqwX+mZoS3QoOs&+rsdyr z(mTVcZs}i#IzuG&+`wYP?ls>95BDBeZdeDpl-*%>pk?JQ4kRRe_dH%V%wc63ssdVt%q029M`XgZIQ}FrR9RjvT%+Thi#E_ zF{*o5=}y%)6iu~zoXWNcgV&OTW;YDhgFH>;o^nD-Cb^ue#mq9otayotI1Jk2$hQ1_Q zC2q(MDGc?|rP`~{zVzx0aP-G%o1oBPd608^*JhxP@2U4>fLj3E^BLg83j$xCEiP4j z`7$v-1040O&JedF103V=^$c(oz&)D*j;}{knTQsbD!wc6yvTv`I`Zur;4aMo#}QtZ z2N#R;7CQC$@%&>R3kYN?+DqV=%m;r7sa93r3 zs|N178Q_@2uV;W``8#SBE*6(69$b@Eo&k>SL1P9urb}A}IM$;}Gr+Mte=P%CF>t@k z0LS(v_jFt=E>*ge;dw;{xDw#HGr%nY?z0)-z75=eI&jW%%5rsi5iS;&DjrpM{*4T9 zY+rtzA?|2SLRwrZe_8&PW`JWk=*R%aeEV1iIQsiQ1~|s|_Zi?={*E~V7mG_3U#4>~ z102iC&J1wFzp z?h?C-2Jq98xLKHsX-(WN?pG$t5{ah~=ftj&+wgo<;{KvIemA%_Xe-CI!<@{TA`d2o zi!jGG=KzzK(|XVBIC*={=>&4h?!52vEYSDx8NAyLb@9`&se48) zr?+8!r=WIE6tkZmAw5~5)Vg6626KqwuBFwYIkA^U9hT;}_WV5$vxPzvwiKUn&6=V! z3wFH>m6$&)jMA3y%vOEpaN)?`VcMTtCAEY66p7u+!$(V;@-I*SnzIv_MD^%o{L&5H z@m)nF2(M|`VPr>6*6`v)^NfNY)#Sj}Iru#SzjN`Mi{G>GI|aYSqXIZ)xUJ|92dHJ)?ovRuSw z$BE-Bii#3H&i=)`pI_@5ug6yIX_MHz{g;U>=tQb#|0B8zzs3A?HiuKaDslNWWAr6x zsKO_+g3)I{32%qb#VqU!PSQl^T{Gk_R7GC5-Z9mOQWlU75G%H+e@sM!jb*7mP}AtrFLzRxKlsc*JINvDd!fM;}4~rfLzB z53XQh^@ox^NhFQhYOiYl6ei*$dDuwbi{!Cwq-SHamx*k3#P7jhu691Id_QrElLt7Q z&DB1N>kPrW8dnZQay3qbvh&E*zKLt4puUGI2XJojk&rErTYD7OD*WYYPvR<{vYK!J z=hi$3%&~&11$DfjE(f&~RIbKPgHqx~P#luxYBzzBVPOM#oRIh-D4%$GpYil9P_=@W zi;Bn*j9a@56hB+JwTBJr&!G5z;?|BqyA%-;TzJ8;N3K={O2(H*3CZ{dK`j?gx%fhc zuN9Px?>MLx;wd-k%aHyA)GEPy*5DQ7=o`Md0bk;pKwTtoEe3BLs7Ar-0TmKdzwwk? z>}P@J);P`HTg&t~-Zoutoc4x5S zmRK~_TQsxaQ-Pvm0dW_cs;PD}@kM6yyeA;EnBCjrtJz=0Pl06#>P3rEEDE?R*)*^< z@<<_CFZU7gQ?7V>652N(C(TqS!(?b>(L^8X5}oD&MknzE!wo*ar;a|Jwz~|Y8f!W`0?qT;(zP_&WGB2Ny|q&PkePpVyaBNsKC2$Z`o zkh3()TMT>Zt?2A(h1WgXIXL+2t#|)=QZOZ`UU-+B8o7{3of>~buaDHQr_*A@4I_3e2tz!0FV zpJyqW$Q4Uf+!#0&Gyhx|{w%{ zz(Hiet}&?P@bN?elL@4^!+8Zi`sK*pDHGF{=G?;pKtbRI74+eANB%KwbCpm&zVUA?^$~lJIjkK-vx-_V zqhPcf6qQmrLv=0Mv|W!E>?(qXD9*^aJ#6O!qCKoP28uyBP>cvR>4)tJuZD>WsU>?j zbnS|n=ZyQ`UA7u=FBqu+m#wiF$}WTYnMp}I(1FBaDhaqSY<9&zmz*M4yw6xU&Ky+mBMiR;Ea_-<`3 zs4h?#&4KC>loyngXaUtLcwCa!FQ|S{(l?GLrM@RY4T`5fGoDU>lH0o5`O?CL%_|meA~*^Txhnh71XhyZV(iYu>72$%0YcvQ0IcW zSx_|cbUG-vIGR$9og1Svm^Fc{JmV&xM z@cf`Sxt6Qd8&5kx%>vJ@^@BP_P`GIPNcVmG=4#cVgYbZ!0{gLOePKko?8Q}Bxe0oM ztHqec!R*lX-W`}78th_|h-G0#oWnRT%E6o*>5e>t>4D4Fp|vWEu3V+_(Ah4JACDnL z8B`W7c{5&$Vau|4Z)X2J`+4aJMs6hs5CRQ-6MV_t@h!|jeO-)zS>4ayi(%ND?7g7J zTv(oWKB0A^2oYaYGrX%DDdNn$oTB;r`}(9c6;Hfp zQ*1tVuxRagLE(O=^4UY@c(B<-0Q%N@;{Be`iWN~>@VI0v?Xe8>55_&SJEti)u$wjw z_t69lEu{bs1-8dR6(7_`HEZd{M@Nl?CEIlJ2OsmHK$oMO3N=I z4RkH348IuWby6Zd?HwDHnVfP+46WvUe_+t^OnZ7r>TF=iFjLm%b&@gOutL8@Co{|3t0pVjb;B zPnFhkryrA<*{2EGZIi!1z%|Zx4(?{Y%1Os%OT-`m$ZBVSmEJA1mi zVuJ{Ruv|31r*r7Tgr&7_V_*Lk7>APE3g1s9syIit03}Ox56Vhs&rtii-dLw7+ui*` zaTeVnPk)zgtLI$L!ioydh3y^j;r3oKm(9L(_##!4ps}xCPk9!QZbZ}(GUfy7KdZkU zXtA}~)8By|5!ear>4eQK1V(QUu-0r#`(Phf=Xi$ujC$#TwW{HmXP|v(2r|fLf9rYJ zmbju#YHh1&T@iw5u-;)kbWoVO(P-^sq^UyGMzvK~7OM)qFzZRo#-W?R6U{+;r-}q% z?FfY}Vv=W%oMw8a*J+1;x&g2Aq?s?2AZ3|LRb|}czpy`M22vL?^&9)wb&zgd2??9p zPMO%6ik5HPd|lRNhsso~2VEw03JD`LsFfMnAnQcy4kJ)XAwr6cu%3a~;Cz(7q4xDL zk9F@gicn8dE4@IA^e1CB#p2!lox*!=OdNuA+_dp5?cvM!v>; zv)44xdPk6yAJ#rDb+2h?FhZ-BPjkzt=!v(+kYDVCWI9+)oteF-q0OwX)^1zb%aa9M zPZhn(GkZ_g_KbVaiqs9a5fVLRQgo3idqIaFhcvQF%?w|%@RHg1JBODKL+GBW0;ea_ z|Ah@TuBEd(>nb|D{b2Pv*U@q9+&2!Ee?qQi`(P{gIW*@-f$**$-sjYV_l=~L^66IY zb9j#+X;+neWQ$V|JW0|cSMGx?r1-08`Z{!vxU+JWI5;5(XN`jscW`z(I9x|1o$mV= zbcPY0?>aaSJ2=lcIKNRGb5;I-D~`FAKg%Uq=30KaH-ub0Jo6Psa-6I3i^7qLO5ph+ zMU)Kw)ygU3ha$dc8&ajE5F0}F;jLBbDJ=!a~CEj*GEqbCCZ|->G7cQh?K}?orm6E$Lble{=_~Uj{YO|6e#x8XvIO$GD{Fss= z#x9jFq__r#?#9J#6cOF$uPG^F>{3U8V_NdM|3Kr2DfL?=MT}kQXd%V*F?2_L_V$=5 zRir#6#x7L=j%nrX>YJ~@OpzYKPDK!7mnsxe^Khkm?S!u&6LhIt6+w($YC1TkU%!o? z_Jk?*dnHATU5c;urqrEPcie4Cd024Zh_Op?f+gFfr^dSnn-Cm5gcm3&V(d~ZOWCdp zTiOL0md+jR{e!mWJgnVqIojglh9F2%`|Y?t2l++OGYhAFjGNfBe0;xt3H%a1GF zp`Ra7Z%Tb%NfBe0;$)L)4ej6!)9OsA2_;30U5crf?K%%vx7?h^S|vq{U5ZmGrqsj*-@3(=x=~3HW0&HDO15h*u5`bD{e_!NsV9{b zF?Oj_!O3>1mzo8RY4a{z{M{Q&se6{3PGm? z|Eztc)QQMDI%4cnv%$%B>8;I6zkB&Jrc|?%BE~LthLFMU?f`<1W$glib|5ONxnju^WXQ!m@4k86A{4{tQ3zNMsyu}c*Tsc+*-_rfRd>M*5# zr=*CnOQ8#aUko{2;?s--5o4EPnw#zX?Roc& zn^NOSiWs|8iB0Oy3;qk$T~EUwD=A{^Ql&zQxleb;k7+?)mpY0=1~_8uQVYQ`OYi*0 z=KtK3YEV+d*rm#ZlwP79y7G5lF{Q?p6ft(Gav`OM@YQ=-`c0|*N{Se}6zhnYhG%7; zn=qwZN8%wIF?J~waY*U)>pTC0={+E%J4Z^Tj#UVFK>&6{+RLWV$HkiL&AM2piLe9euV_Ht`y;QH}gKb;dd*T3dYTWk7cGEW8 zhgtNEiZ_5+Ix(fv#_gh*rcwNKb{U1SMXOoH6owk19s5f~K=lK#F~cHkH7f0#V(X1{ z#no+EGmiQWSospG(DKG<;L+RGrW*y6p0{=M_iyZpVb85PP}^7Q4c5T0U~_Gq*Kd5u zfSo-Ar@D&PxU3cwOPl;nHQ^9W-?m%jNI!}qsjk2biD9e^GQPTSBpi+gbYVzYW;&&yt`Wu~JF6>gq4hVzx}U!(81*$+ zG>C5^QkHW^hTTahsu$l^uM!dzep z612UqdU4z;+Y|~nA@RdDQ*X+io%q~hq1d~SQ$X~z*%FMbhw=<)5EHY!wb-wRQd|Ok9R6 zVtPnLm60D3Y*PLPZv^&9ePN$PNLq!h(7&A^h~nc317L(QfEJ=Y7>fGP&ZsXbOc~3! z6qGi8OhIMg*Azn#O-t0@SmTRWO#HpirX}PJHU;YZ{>DbH{Cpsr16jS)M+{Z|Ds0sY zW-oos(V8f-RF5uO4}N-)D%hRa(g#g+b0`>W^r1qk{71b2NHo&PO*HbrA83sFU|co{ zot&iBhTR{A`OC(JaLDJk#mA`hNl`MA5|zF&8ud3fH3q!;cb)1A^ zCYzr|EcN8og-uDArVWQe_5S+zZ<`hku)j818}UVq43Xb~P%L5Pwn}{o(rvjKel~`^ zfj}TwA3_>OQ1$FzimEH*XCP%I7axKQK~yMzC=_f6M4I29V4%SptPM2!V9ONgV}7DB z3o<{_ASCiDjp<>tH{=V1qfuDH)ss-wdRe9q*U_TO@zq5l4b7$<*<|_3_wJ}e!J1H0 zFle-MwuXuW4B6GD?x-XFx^P2N^9S#!VPm$TsV)*kPU-QNg_c%t&CfpQtvOEEYPLie zV)$xcxZ01RDZlGj+Yw!tkrwuDIuycp;o5-RV6CGpD`6wE5XPo@e=RDX8kC9l315c} z-%X=@G&k1-nqf{lT^9yr%0p{s3(L-treM9VHk7uvO)VHgV8fwka}Z{E({!4t1u^6c zG}Hy70oW+klQI2ZB87>Tvnxx=OR!Z?cZP+QbXFKj%M_ee7;=Rbh9BVtMxVb)WrZQf z#djKuOJSkqDLgJq!lkmpFb}v%;JE0Ijz8(F9Gr`XT>eK#)v2s7@J*2GO0Q8k{-o1) zGalZqaJoLE+XvZYxf|YGsmU_{{O7D`#b9M*%Tvbb{oAl|Inhhp=G;#gPJF~4VEbLIS@p@E+HTYCD2 zhI;4suiHS&F>7EGsB?JWLvOQOiN&e;%4nQ4<~W?ScCTRKfw5o}X4%9kqMVP<)jYTs z;!l~22~u)SNz;Dt zpWlDNsVCQ=M}GYT+xTi}e#>Ld(8+Ik&hK=5#u-@M$tuA4DcwoVGW{06Sy~uZIZJ`# zolxG?%}_hnPhlxve~03{$C(N`@a)RcQfq^BxK?UmRjH+wLcxKpnE#$)#v)ZKm5DuJ z=5R`T!b!GMJixu7S_+WDc{Q(h0n9e(_xxo|NOn6l?`~_k;qxxkj)H8=#Iu0FflS*< z-2jY!nvLE{CF{Eb^8W#x{$+zfP1ouT;)}$U_@hgwj}NW`<~kNUxcAa`3ozePxODoC z!h?H(*^fLsoW2)1zP<05Tig1f8)XeUG7QJ0Gj2fee&p5iTlp)j zR+eC0aR@7p3$Spw#IPb+zPF`yJX}<$?}}Ne6WE4Th`;<*iKrWEo5P7vA(l5sv9~C+ zlg+%ZFlACtIX#*)8mKN;eG5#pB@CZ>%Qj9;2F zQmu_;B_57$@FS7ewsx!`2P8KyU3B5t zG^ANR43mb7^2S0rNeRe$ItzcfV%7C&pxhca!AT0YqDmiy-y^i6MJvG1gyMi!_ex~Q z(a4yY`-#(F-*az4p{Rh-kyi^7j}%PT4)8(ZX{;kp3^JNk=q$H)K_(CBzh`g_?{~~Z zboXpIKG84(nN+ys&)aLub}#vJ!IyTA?!M%l#9-c%x8idO3VnqI)9VToK4E-$A5!<| zL__{qB%jxhGIle^rmy9~@|nbtM99|4pd}vO%kQu3e{;oVS4Kki>}+A^arZ$xihW~y@LN!bheNB+X;ys zo0j}?(7)u-9Wli8ms_fqY@M;a9C6$_Lqu}8NG01?Bu~V#CLcDX6SxlKCH9PcG@onc z8J!tR9!1gfK-qjKW6AsFmSYmjXDoSV`%I{NM<&_yL=Dqu?CAaS>-faXgljB!ERwTd zL~!D${dJ;s-Y?oV5u35id5L{voAc?r@Ql5`Ort?i{Oo0E2*q8#NItpb9%U_Oj z{~aH7>S5uv4^`8dwB_J{dVW250N==%UDgGE{FZ3flg^|qbDDZQ^YU(W>dANLF-_WH zU6yd>Vzp}&$7yEPT=d3nitb3wBmC90M^`h9b)H>x3Jh?-0Q9KR%zAo&25+BnCm16th=tmhX931uWB&1sef~9-By0OlVCa2 z7XIiXZPQOHM|ojoS+%{VVOZ;THt~f`!^pf!9o>OJm&L-Xb+}G`Nl9fTcnizR7s*GQ zKj;=C^Z!M$SdYx5OEofIkvvRJGk-9WgiAGlPy>IOr=w8wH4*Me{E3mTr5cf6kH2?; z3G&4fjuk2uZY%gPV1A`=?59)V_$9g!ZF^95kFp>aMlZHjJ3zDn{9OpllM0tk-%G&# zFEB40N2&DjxCqaJ$78i5{^;0@qza!0{HGKKq;LXfY23(UcwSAyrLu+<0`AYiRh>X7 zX&c+iH=v|+_TbqUfO$aSSPX=}ow0Sp>x=4eD;%?SKQO13ua7H;zp>F{Kc`gGAmoA;DF9ghp!o8Qi9|H4evc44l{uG#(Gr%1L z=Isn{*~q+OnSpRdJW}|33NZ6Cz%2qMm;r7%Fzv~>r2JTmFl|&A5kOqhmD9(8d*Lwp zc0&Glz;v7}wTX_G?Ny5SZUN?Mg)`D6DSR}W@Cji4!I2vrS1P6pUnw5e5CE4>-(oy# z1ZG6x-Ya~c0p=Tr(U%7WcK~zGX~J8vUN&9$Zk%OWq)ZpSUC{Sk;L2u8eJoz-^vyp* z)0W|nE}g!wq5}#7Gci}<7UCzJzLzm(d_#>J)9LHMgSUZMH(%=GFf5(EeZV}YaE87V z<>1%AyqSzkDhF}+^A0fB^C%o=eAD^+4lvWOW{S@6H%Z_1c;*J?s|tr?Ppj{4U>-Y+ zJ`UlY0p`&X5O5q;rVHP)QcY{ZA6>fe6(iqP0W(rAaa=>3PTx&f0{3nF(WTSJcJYV6 z+-t$5)AtB4&suPze@p7mIn4N#!q8v3RQ>rm;J=jt&I4R=B`y}1N*~i9oB@un8QmG+ z&IE2C101X4XEMOi-}^JbvD!Y80glD)l?-rPGJ4`7Tr4hC`mw&w$^gf9r#J%~hQwNJ z2Dn_{R%U=Z0k}08;24jg3~*-wcUcBF`umLxa2y9em;vs1;2zEZ$8>o<103`BR~g`# zZ-2@FM}5W#Z=~T;l^2F@DmzV!ONHZmPC*7Z){kQ{z){~x8Q?s?ost2L-P*DYaOVQo zodJ%`_t!JP%>eEf8Q|DGzmWm17`Pc#xL91O{5T!Y0~z4hkFL)E$Kls-1~|SRe=-9c zhml{+0EeNF_Fx7$*0*10fa4U^-%{W()$l>S$3F;lJO5qZZV1d z4X*n%41?5{c^L3Z;Ol(e*j;%TJB3$^H==i?n%t4 zA2ITeyvv9Q3e3oZG@h)%_M1N^YCV|mD)J$D$H;>hr$LYp#K(2(v19mpb2V*4(^@LOZIM%Lh?LLj>a`v(h{0;tch4Cs$ zU1RXR0P1G^xwRK?{kow38&@K7H6$G@-;v5i4E`T`Zvr1xb@q?n$%G+5aDqgQiaJ72 zFzjJ9D3g65%SZya5<@Z}!H~qv42#7I9Z=#BwXLm7wRLN2t9EfgT5StP0XJN0X|?KG zZC{Yu+G+)H$?yAp&bfEyW)gefwr}76`}w~Ia^`!V^PK&h=bUrTx#uBorjZUr-FqHm zH0-YkZ8Ff;1R?g+C9xl=S_#kY+r|P_+34HGqT4M+3|>>aweDYjL1<-&EpwqcrU-GHugEw5m6fcGL5rf-!CWto5{^IE`a@QLG2cj5?LBh zWs+-N0h)^H_4JgU!B{>FkL+7*MI1Yf(;v%v`D*BT35vp31-gVePH(}p5u3C7Dmt_6 z^ljU^(6F+FL?0(CeGlIVN1Y#(NH}K~Z;A7J%zGkJ=jVqr=2wT)>vvuGM@}7B?h3l< zi7AePs57O7^(s7N%BNF`#(A@%l>>cKT-7#M2Je7c8dwrLIVM#jX~5R14?T8QF}u$d z>KZ`vTJJRLwkOf4i2a_hJ8*ExO5ExxmxZp$)Y-^{Q{)WYEmUo*ZefO$xw|x-je%P} z*at(d^UX$qB9F}OTa#{HRLDkhT6BTid;N|r#m1%`;o~GW9p}nE)1Oa=#VUSKa>?O( zxs(eBTGa*42f7V^nFb4Ab(#(!)oCI?bH&FOfRvA~13iGhOzC#2Dec9xEdH>goxw&v zhE+ahiIwIJxc)K^37=z9*pNnS=R~r8S@iJ?rF2o17Ifi01GSWWbG)NmX89>5HZIj- z#{%7qzf6Oj>l#69&)*Ux=aVAt+#Rfz)Yuk^IiR%eG}*uEtt+V`^FMCT7^FY>br3%M zdgOI3mvA2GYMcakWXVcV=0Q@;O-4>%m<^>Cl7qH7igl8pY}g7-0~#STp0bjgV$*ej zKn-wsNDeZ`9Hz;kt1H3DI1Ixlw(4Yr_ux-aj4K+ON9^pSJBN81 zl#-b5!;bU2!0t+9KSr~e?B7%DmD#Dh^gccI($06%Vy-QL6jE*k??Adr7rDIMp+?>%$X%B@8WE4^hpT)wKtiGRZ$!?AUrbNj= zD;&x5Y-T@6Th`0@xDPxYDQ;>J^vIXpUj{wXI2E=UVP*i`DKuC{9xWL2MB9&mKR+3i zdb$D!OU4NflW`Y;kf{+cDowxmjM9my~$dY_hURk>UQM41YOv`nqs zF{oVT@Daw`+hwa(E}4a6Gl7=TcX*s3$gW!Y;~A z&)MsD^Nc}S-WEkd(e?i`_);x(+XT{Qxsd#qAVbv~<D;s*1JyODrL&;OOI72QQB8{ruP$#AA=Wr&6AfeBAZD;b%wK zD4mKJS;ppFuzMvWqZ{#mu2MF=0AM88V^gP)~-H zN^Bh*-oork#J1S&+%~5)TR=-~Zs|5Ro0HuehfviT+bpyb=w1AIjNP!6AbcI@J)yBe zw&E|-_#5mVLDV55MMHT zj8iPyETH4S>oM{yS^(%B;ag(S@Mv%&1^*%WGDR5Q2RsyNZ7>XqoXJ>e#AKIVbnAL^9L(W@i1UK`@t0}jz*Z9-0PBrXiZN6~>_ebYU%?jq-cAP5S3uba zL2+;P^#GX3Led3d4{<4hhpgD;MgS)Vvo^pnCJVcjMs!DNK(BOGYt`b>pO+!)M)#GK z_=$|gILS$IR-os~Js>L)2>CGvZNB?Tvc|qn&ghZU%cn^TGrMrw?h;-uiwQ06=Vpr7 z*!7{tjgK?sy)ju*dAF5ehGEE!(KzWA-TA3#LwOY(rZ$u#sorbY_AC#W!T8d9jhQpAagIS@dIs)qKYHa5Q|6?_dJin;X+p_qbbsniuB)y? z0HbbTV*4IeHYqAc2QL~Rb}J?vYE!*jGf(R&_{>U2O2CYif-dX8K}ZKFD_eo3o5BP$ zWACOXz>|^+Z12!^0;Ckd_5!K(!jnKMwikia zRQ>lrD&)gJoEvzIPk`PK#E$e^LF}KbZx8+;N$@llzb<23CZDKL zWM*{7r_sZy-m7@)bYJ#nGU^I@xEgoZpR1b8TWKTqK`9X%OmAe^?h^Jm`AYJtI>VbekLsXIHo@o3;}z>h067pL>s^=X5Qa!H_eL?xC11bd_`i+1TUpje6#gck<-xuCT`KNGYbh@#bFYyf&x5G-R8o@mTb=}utIS}SiSRZg^*srM=u=Dxf1 z7bLQ`W^E_h@QA#*@fIIO=WU7}9_qcyhqj`7E}9tH6C2Z5Hl}YTHl~X%z(lLeIv!uC z8^nf3WP)aO)bN?;sws@{8ur`h&Qz$v*dim=SAVn+NqH<5dl0|lcJi&wsB;#XZ(`C9 zrotx_&aISjGk_p4h#RpDd|BlW=$SQisbp=2x`=fs1f++PTiaSD=c(AQuo&UNb#rxs zbL^_y=RAhtCU4JbHDIa$G0nzs#@Q%sZPRlpc%w2{`@w~dosJvKwX8m6mA zj;VFSl`m_fr+Suxx3U^2s`9kwk^L zK=w+%DHJjf4&OcvKAVwEErf*2y*r@aO}Y=m#{`Uotb;hYZ`-+irsI6^VTP#~`vnqx z+%K$I$>FRXBQBHvejvhEmK1`7%~s;)TkO8hER=3PnVq*geDZ*@$!sy1oF$o+ml}J5 zGo5}lr(5Sr&ysM~ezyPE{)1<)OjYv&;2A637CxB&o&3O4ez_}{Agzf;% zQh(2&n)QrY2b^pwsu#Uwsk!LH0jqN-jE@8b~kH}ID!OS`v$pwa@i zY6ML{4~y$F7CHl^qi73({u6YMu?R>_4K4suA;ZDoG=j!uxLMoAckstWf;!L4Uzd@B zhRgWr0x^=x_e-NJ>N}Vy1jAe5ar(ul{8~^a?B582WrS(LNU`Aee*CFd;L$&(;TtL08I(N@Xg>Aq9*P-BA4acq-L%`V z0C}9B$)xAC&s=}f6+`l>r>#CVX(D_P-}b~x#?F|$yw*Yhvh~80rx+Ph;|~Js)E~YjyePV(F?x9Anj-JE4RA0g zS=)<%d$)5dqj!6W*rj5ZiOsU@-CiN~7_phQURjA^>Cv0K5QX!=#x?A}+oZTthopFh zrm;cy;?E@>9Kcz`PlYFg9-_{T^T^K z%{M}vtR*a2*Nq!+`lF)6(o6!aUl!}VpqI&U z-{t)i;A1u1j-?r$>D2{U`nZ_z0;Fw5igBS$h7Fc*}V zSmVvg<}c|WFll#P!vJE2ORWopUBz^{2a4M=BKOqtv9 zr{aO@M32!3y8?CN5q)J!*lz@lZ$~_`d(YC&lohI)v9Z6Z85`$2YR1L^MhyzD0VyBv z1F_#`%3I}Y1^o`8s!+V>lQ#)%5|CPfbLOd1z%{Yr`x20fEe51w`!bMWS1{ZKwNXvJRSjzu8g5iI zwBhQ&RZx?WU$_ujV|dXdIag9ARr?BK1(XJLbW)wvSrf*GCMxYR0*4#R+b#*UUKTV= zJuGtRBq>@44fL_p#6vaNsbr+Bp=$*+pg_GyI};PvDrG?B5|t$-GKW^-Rtt+8fm*t5 z40RWssoMgX&`GjIAa`P*IGR-8Z3tao?#pDXPy`jmU8JE^tzkqw+^{?8JDH4*#&9rfv?;p#DqeQ1HmDwh3M|$6;sHs0oatK}FI>$b6_1NRJ3H{{l>7IVp)pD;-M6`^iZ> z`o4n%o>P)|aE%IRiS_PF;u)UAb7~S#n&L@l^J9f)8El#lch#ek`?rm8aIu&3*raf> zg=Yh7O0B1+ymK%)obkew*mts%!Z}TNc*=pLa6;2@m_GMU&*@3woR$>M1mT$ro9Vfr z>Q@gWhchuLoC!(coFP2i5oXK2!LxgMaySqZ{mSQzq;Mt)4|lNGYKxwD9ZkD`z9uJy zGbt$?%5o^tLeHB4H23{m?@11aqolpQrX+7>omK@HRN#V>(3Wriojd4uH55E04 zItp``*xxan_e)Qngi~M7N%L$LAB+$FgrFXAVAO|sf?Vm>(xqv_gF7JcKY>Dcr+(%S z<5w>w1;A32C(K8S@=6lr&lbguE8NkhX{69#%BPJ<8OF?uF)1e}QMm78=UI?M;p=KU z&$1-SswB#WB+AW6l>3t?&m~dbNuqq5MB#3eJ%#)X$4<#fqMVgPF)ue&^-li{Nj#U@ zC~D@}wU)e-3~3uO7Yz$#o>1tvQTv)>QNFGz(=5vOH02nJ@)J!NZBd@olu;JtH=5$L zCn(=5uVnljd+%+Qn*EJ~@SWLcC8HD!uLS*0nt7GR|cEQE{>LZRz8 z{E;H+@1`pWn@C}2U+qeyP+IZaVcZvGQ>_kJ!kI~_$M-)XwHOx(vIRnlii?PC(W1dWjeiW!JkM`hBKYq7bj9Egk}6DkA!T+Wl@-9Idy1J7>uaBu_)BoC-KB79Fxw{ z)Oh(6+9*sj*J^QJEU_9Jg=5L$L`p6x+yj*nmiZ#VD8?TtDlTU1Sj`hJv7AK83`w(% z!Za7!D6G?EHVRYNgg+T88M~C>ahf7=N%{B^DbhALi=nT0dKkJznZaxvM%$2?j8*Rk zKqW=_VwyWOkD@S)TN5cH$jMjbi%%~h2c|(2fqBD5NmQ1|IvY&I;=9@xdF<=Bv&9$3 zP?{@#&<7S36O_1d@d-m7yRQYHxLrQjH0Pi5Vn*E8`PvtG?7sYbeUZoRs{oX^D#F`-^&jivzT60bhCFs(g`l`y zJ$zQ|+uRRl^rg>6k#;AZA)wf03GyRTyL#o0K`v6p}Kvbe9?wJ-A6 zeU*R`e@k=zO*NOqeZ8uEk;m?bv_q9)x$z%6bDZbeAY2Fyq^!2!}5411x*nL%j5-*K&e*F#tFl+g=p$rLo8ThmN zss_dFVvnZTa?*)+#eLOkU*xg-q9lzg`n&Cl6V8qMx?cMtkKI>5eCaM>T-)#g#7 zI?oo@**~}*!rP21O=p)pc3$l`PA@R~?-{Zw?(0SEi#&E;%Rq6vvgifo zuKkVZ?q*zGExO2K_f-!{TZHjEuhAVSQz7HePRvHJ>&uM@Pd%RYJFgSf9A?Tb8iU(Moc ztoHTH^Ka~n`+7|KB9GnI3h`yis9P_)Y;N4w$J!Tp?7mvWmlk2hmnXgUwYaaGbU4D0 zN9DCzQ%FrQ8t|mna#{_Eeu9RpeuR#8C=1k^Y2ipGG~2OlFk7Ap&2|J+T3)%}?S9R9cb4$sO zd8&TI9^q1+0Nt@6jXLWrzC1YZ3oJRWWuxTp&IpQTwOMXI6-r$#G&rn zf@YglJN@*lYAdWiYh;< zz*3?H1%*fm^oB8!N?jDxuoYDQLq~B7@jrP+d_{P*D<3y+oo9i&(Kx zahzSTW&p~@pnT;&!lVSK_)QgM z_Cm8)`K;2iqMG7@vI@T(Pq7tg0d$E~7FAZ2L93y1MT6uqmqC*>ud*UgTvJ^>NP*a+ zE?nrZ43t+^EiA8!Hz*y?f_YH92o0+#8y>{O#^o|{=PONL9k*GhkNO?gpiRYktvJa0t#KuxVYKxBzR zbVm%H3Bm>1>MF}B%8ILsD-(Ri&mZ;oZxvBdfxob#G*E&h`|Gq8(OLTFk#0mfE>%X9 z$d>1Va(_V?6bwQas>*8D+P|B{3V&rmAW&RYk(f}Clrm1(B7?-26H-=$g;fx5RV6jW z)m19OutccNEkQ+TC)GB}u_-g{aj!-GqSB($n&KLCW1g5&Ui()EqvS~@=EL$^<1eVG z#@JM>r=V!3>U5K>_MnKevZ}hUrnI`yZ=QOx20lHG4^-;~h5m}F%ECZC6wz|_ih|~t zh2e_Iw;^X_xMcC$8(P6aX!m6Yt1L^XbLlp6aLQ^eiQ=-b&|g|wQczrk&KFOlYKq8m z{7{wlZIuD!LTO-ORZ(#{8Vcv(7#-9}D{HK`mB#EqSur$%Lew+;qTo`-U3Sj_^#abA zJHDQw3U`*SQcr1qu+@|4YT2u8ql#!qfc7N`V!Lw8IF$n|R5C2Pq_cVBJ z(~DlbX&y8@KguJZmxF_aHxB;K2hZi2kBh&-()VTX+}V^6+bJsX6uUmV4nI&SQs?B{DNyyOO&E`JY z++F#OCzk#W)%I+95ef7@T=!1up~o`tlEAy^XCUP5@s{qSpF@usNM3kS?vBlUVT4eG zJ-fSiYyxm=Y%iA3}I@;$CjqC;u*P;bVnT8J^%Lvbb2i!`*{LI_B>0G3TUV6L! zn%5gSG5WDTbZoaG$5d(yb*d2`T6q{cg>VVqXcgbqO&1~$^uG)KcftQ>%0J05mBSL9 zQ+#usfh%jWiu3N3g7toBB)(_D?MP#w(sAPES0m%`5#Oo!zIoG&ETirxV7HuhI?f3k z!fFF&|L@SC!kdVG&qv~%;T0X{N4c<2it>I;Da;PmNa9q#jP zzJ{J9mAq>sdKLr22hQcl-&vW+fp_!SfScdF;yBiXE>~SV2MX0!UHSuOHkz4H-bRN@ z?YyI0aw{Ev_cO@Yv(d+WIeYMtTqc_3HQy&GIlvEbV+TGu+42;Ay_+_Z2_Jgr_CEzPG?Rsud#_?&e`rkaad!e9Ur0q6ay(IeJtE=xn-) zbg-Y?96j3zyGo}amp3wctKl$(gghiNcngT2pe|rTZBOQE)JJWS}0_pn}AqZ9^*csQ-lwe z3=A*h*KHJM^7$nE@x~iUk=sd-8*j?+Boc$d0k=({4bsh&EL0nZOK>*7yZ(eLys<~K z+rYIEHQaYaSH>^+ll$($p_&c}b1|IJ9w>d#M>@n*`_v-|w zgLkP}qz8`26CxXjk5l`?C!u{#LO;*Y!f2}sI6)rav(VfRqfhm9qiRuH-Qny?N~1}L zJbVhTRN)tx0jMm4L-$sx=GY6G8EFeQ=01tuKVsg6TLa-C`FVRGX!b(Tpx2M=1`Q3Z zvV?xYwnNL9Teh;Xkb4hg#2(0q!;}$<98>A=>nQSm<1Kwj3*OzEvia=_4O7>O!75W zHmIa|&XhD6lr&#OU=qYp2!gUD1cGp0 z+;nG35qETNDqGX(!md6&rOb)$O*7dOiK)7Z>E#SCuvzFkF_f>Afqm^lOF9>|Z4)@` z%?Sdh8?8u*nHzzWSa=vni4=Zbr9{syKuYv{2S|yYUjiwT}u&;c!mxcCm=b*Zv1y@<{H)^OoF~v7i6cXRs5(VM9=RXJ`S&=?fotJ2@O~ z4cfy|XRtxW2o*OBAzn+E^y__}+&GJ-6eUqEN}{Z`C}ubtk|@_|3cn>$vEQL7{E|gc z?$Z>01EMI8B!%;eMKQp008eVm0dI-xgILdFdqZvX)V2kKoqq27)MJaMq^LYp8w~sB zn$Bt&;K%tX%?~Cp#P@-$9iss@h~(vYd_#yYiJDrQu}`6P50bYwIy>6TtrEVXs9zQO z+?VqMX}-&yIbAJz#r}IM&{2g(aE+R>;r8-OW~( zU}S}y@DUB2_Mo}H1io*u@4!%Y`KghuA0Io}x6GYgGQtd`nSgwEI^_GVL%w?)^8L^u z-vbW$9(KS-f$)d}K33Ud4*2-O;3)@utlF0y@G*VAb->5)-gdyp@ZNR6$9C|6L%zcf z`95*TXLu2Lf*GuxraI(HbI6zOkT1g_U#3I8EQfq!9P;@F;!7CdShO?nmkqupn%9Nr z!QMz+44%#ezJcDDaqztiJR1`D1`F?M@Z6lhH&A%v5#C+kc~bLnm>Mj+--74ezY`vh z;~WCdV$KaYrfA*-(SI#G727G1`F?OxTS-qLi2rI zc+0@k{&&K|9LiV=o@WyH2Fvd&;Q2!W-$4201nfQV{4IfRu<-i8Ex->^t*^Pojd_ef0J0#$#b5jk3m~LPt(a$ zrs;h5QKsqSDb#5uJzp~sSF0q;O?u@;l}nLC<9YJyyfeR5HoR1PD7uPl3wR23hKZ|+ zYtLsm#3hQ|Ab*KY8|lS5OyZ@w5HH00)up-+eZYl1!(TQ2Xei>8ZWYcIlx`J{QcAaqdZ&_sXO18qS;h19k4K*QUPWCoH%E{U_L+hx z*tt32F($zF3z`I*wdOIV!DiifjG3@m1L^`gmbpi2nkDNIe=I+b)G$lQBX!5J@JJ1f z6~waV)Cl)t!e)#fgFHEcE`&Wr(8aK)3u=PRxIIP{4u{r7g2qzZ7gE;}F-p2xjoOB= zQ5$KeTT{b2I*0fRmUe}}*d-)z(*+(P7>WQQ;-jLW-6#nz$4x$6Mt)}(e%Bcl2(Tj3 zX5>d!7`4Gpqoy%zRCla4ih_;2Rx4G#tHhQXUV5E~Z8ctZhwTt=h9A2lxIfVE>(2M# zX1MLlmFQHt79bOUYTn9UH!YZ(@Hf=hPRKjM<$6xeMVVo{iQ#c5_k%Lbzm<5qnVq?x zY<-=n))kavdO6o1d#3CcY!w7cN}j)|v|xJhH`F*suIZN~ELocS;jSXgtD!h3%l!-T zcuNoW%~5YYacLiJT|2%6H|9n^8@hf!w!b#42Xno*c-OKE&g-R5SAQZGY;5TsS=y%w zVhdnvS4G09Ewi3tjFeLO2C$i`B}*kal9JpH2TVx1!-R10##N^35b@|K0vNr^NR#Mq z0amIDuxIjfJQ%sSY<@{%5oBOPDLvX()O7&rnD+GHF7A@Foo}Y*l%&-!+xce71-;BB zyFPTR!H&npSu%}FD=@efm{&zZFG}|A)NBZ$KJMdj7ciX_`~nK}-a zg7!tcYIi3!n43xLwrb8dO_vifP;P~jr>Fa&l@A>}s&p31t zw~OLx_*2|ZK9|AxxfJqmSGK z7VONAKC=$_WS7W(<1p6nj*QG9!hCt%->KULmb9nhp08AA9LFzdO6Eb2<| zCIs4vI;>qBeYOvKE;D(L|Jo71Tsq=YoC=tR9kZDup2a5qm=V9d+9L-9D$y$DvQ^;M z$6vT+ao-is6BsTwxypbky^T%Koe)N4qa#o9czezRL{B;z`r~#ah_6W6)g`VH+=IQ} zyDhF(4x1^P-a#0Ub#?GmX9SQ=1bit2ZlSe=8*~lLpk0nj4ZW|x4UAWqnmy7X7?18* zpIz5e<1+8r{^(!|wtLqj2a)3#@KQ4w+;p1D79E1CuP<^eT}{VS?ncpZ33nkUKElXz z-_=JG$XIJ~QZ$`X9PLeyep=M^d(;j)CM0u{btQC5Z>%sawr}TKsX4GxxO215edxe6 zbd3JF=M)2}8N;IH0BJ;4BC>4mdiiM0SC%RZ-AS{ehux83?r?VYf#0I~#d{>z^fs41 z=Bn%eOf48thL;ihYIMP z%e&b7&`BUgG)r4{8HTFZVHV(dv1fDkMn6i81UB}qMPI+7Y#!Q7sNm|7zAZ)Bqvz*@ zQ|C{PSI>D zqQjFZ2QJysB!>;M4z5GoM;nnY)bWJPPe!IhKf|eqRAjxUv@d%2R(C0p0I$iamH#MlJE(1M(|A+epRouDs5$;RVpXawHkr=gZ7 zu=&X^7Q}W&_x9Zc0gU!?#fgvQ?c=s_-e;>PB98g!Lc0x$nceET zATCY=GL6YV9Fa4PLLfD!E(KC!>N=p?#PwT1*9+oFox6cNa$G}&mx}&OS?w`+$%Ud# z0Q$1{m};Q{psxyzmslv*#THs-Azoi`qwuXp<|y5vhzaO6LGM`zj|SiDoPggH<1`ry zI4W!Hcrnk0xkmUD9(#&;p!>&^Wtdn-hV^;GIr4j@OH~yc1Ds3?#$~vWRi(LeC?!NX zG_7#!jq$nDFUT(_EGjN3Ei12Bh*PUI0jP(l z!#(Neo_Bu3^2VlM^NN<%m6x=wYVYX06gRg-R3ojb-*nL4{CHQ*%+PARk zGOM&*S05RcBBIliM7xO~%hsNhWiicyi2J+ZrPX{Ib z3Gq*dyn1!q*Sib|hCFs(BSDFO%06-T`=`f!jgXG04glDFp_<`~B|!5+!^@}uvo3P9 zFY?%Zc|nQitNh3>K8*X~b-*;_vHN11jmLHEko^#dW?VcjN<$vIuTh}HUjr)33`y!9s7sY1WSMxs{PiYnF2 z#?Lh%4`f34GW@Egh>{6>+6SH+@u;Ol!hYe&aCN(8z-G1I`pcWc3MC$_;VTOJftZs; z9w#33@d*#*EyFoF<%17Y3KPRQRe0FT$V1~x3TG^+>cSLe>kI!GLF7b<;fxcW#Bc_? z+;AB=@%O}E5B(`QU*nU)8SHYybHK?|{IISAmBZ90rU$~VU-=Anxgpf<{QaFQMZpcxU;S79%9Vb)vdLQg^L$2wWuX(TJZ%Izi z)TD3*yWEiTLH5sAvI?F{4rh8&IQnwKg!asq>~=Bb%-6l6e2*rFlbaOIjHGrrQ+PP} zW4=nieMyx10El&3XCT^Ls{-?=McHbHpmLzlF6(ksji%h#{8 zulV(Fzta?zuXe&>B9GnITu|ID&ZcPI>3aQlabMrozR06OdQnrzn_}>yDs@tB z4X1z_ufl}_E#|Ecxq+hm(uMej5*q-v56g0^^Gl1%tBV7E>*7rD)TGy{n#b2 zyOh_IlrIe6vtsNT^m8dHuPLsqF7#s?!R~^OYAdRX7y7ZWV0TzpQ(RVBg}|`WU~`#W zQCVD6TvRHFM!sy0a|-hFOAAZz38UW2u({4Fsw^)p$zLdGS34Xw_qk>Hg@xq{%kc%G z-uJLM&&FrvRn-ft%9)M+G0!cpE~u%gsjgvGWRJw|x27ggUXowI?DY4VTTzbBN(1G^ zer%`MeC3u^6ciPr!2Q@{vAfh1RaX=&EX~J<{9SgJ%Hon^+N5R~s*awchQt^sc8TiT+q?wXU>@R zUpTQlW9GaWik&BRhs%lGUt&_q87$2}Cw94&ZZm_N*nO!VpPblDn0YXa68zl>aeY7w ze-1^1oh%v($K&)^#h?c|S#%%hr-Em%=0jEn4R1I`gcI}_F<5x{NLMy^f(!_TZwCfT z-#y@YMDtnUCA?pte~w*GXdXV(40KY7$$DV`zWr$y>R5~giM1A2rj@g<%Ufz;4|?TKS82f zhitrZ%PsSEx{4NFevg?&-E}_fZKPt;C*K`_l|st}%cZtw@Fq2DrT$zEA0YaoqDHo# zR@?BbyvpqC(9|X1NQ)hc?aX9}rWYgcFN^K2N0b@X4pe5Z_OzUZJ^_01xjeE&bZt-Q4gyDLsYm7xt4&xnydW=jf7}=#mAOtY~j40*8|;dN{+oHH=LOq(1lE z5xu!j=DrwRe|@$Q8O6QAVX?<#x94D1{=s8F2xoAwFE#JkFQ!8A<^gOB7DSJvt$&tI zBkfM$8wU62rzzgbeLdmqBJ5d$c1+&K>qqsZ=Hwl|e0bi+k)mCmGfNJhjjtP1iK2a; z$cgw^__(}3dpBLqGWm2!WcWtzb@t&a!}h-LquDJW8*xSU8SeK=qkU=X?_lWZ2$_3k z64)*eU*#9&yjPOT2m2w9>wOv2KQ4re`&t%>ft?$Tw5xS?c4NZgnrkMYY@oj7W zy&D7xgB!;mx2r_bXBc(gD!C+iSelDml^w&?T@&^iwtE&T8CU6eev|#2yKZ#eTr17v_C4XV1~xocE>3ysy!v8X1dXpm|>t9TLqT^FHo*CK}HB z{=s?6PJ|QvpE^0+(h&-W*0ulhvlipuDuviDu@0CuXZC-gJxrf5J6Ex@Jq(rhkd7Wp z5lk~sd*D%9n;E1%P>*t=k#zu;bPWkaCOWPTLOJ*cxZ9=%PTXPtqVCZYeS^)%e+r(b zG#`^N(0YL)>t*olPv9FYJbnXhzNIw7``_BGTRUg}E7~;%^uE|gl%ZViFn^`7GG*m) z@h|u@Fqhh~`N?kK@P2DYFSgBgb3`*(ero=pd_SH>MzXLXI1s7Rj(kIi%la)EWVv?b z8%H&1@LMzhQGvi;({SpbwKi|x!y5E%qSKFDy^L8+EJ!d1FQ$x!JBR1 z95tax3`c!D4i9n^o4+)wV`1|~Ose72lyXgpf0}I$>1z7W3ik!AovUZpuj%NzBqT4i z2O2wh(TmLtGImD$@eTA24V_ce;7~0x4Kp#=7awu0}LzY`uM&Ue6bPXgay;XMSNCldIWzJG9xeGJiV z`k$OTHvDTQk63%BhXdvTKY5gxdRUeRWRN5nm+VNst|e^K`}`{6m(yX(q7 z;@1U*;};3LqHAib7xbwJgl9`KC6O2n^ zS29MN_a50@64)&dWZ_#qb<7zDkMY?EUbL(<%yZ9acrUiBcO2N5l}!1(hpz=xY;0f`IA@$!p{3oo|*#q1z78TR8|K>}_CJ(@Lv9Hz#dwbvq zCv*SCv-2NJ4#)Z11C|kmhC2K}l(@M+*xLiJS)~d=qKAJr5@k%v4E@YE15#Jk_kDbO zpeW~Q9=AogR8!(1e<_I)Uyz#N#8>?$RNO(A3n$OZ7DgmymX};j(IO zfAw=prcekp)@v{3^uzR3&)d(J%U$kjS_0(+!Fsyts6s8+ALFhaZhIFFMToQ~kP`JF zC>~J?z#HE=md%|u*POuM_y6WL^QKI@aCxM)ttoUNCMu2Cd7Qkuaq`-^vnO}qj!x`K zPUgMwt&Nj8&zu|zb+%4kW1rhJtZH4+&=LAyI=7iSSKZK~8pYph53^>?o}u0pac=XW z%xz{g$JL?@G`HDwn$?#S7-VkqKtH~L<~Bd|V0gm*&RJ7bP+T<)Hg~vawqdNoAB_ut z1I=yz0{R;8w9FxwI`=wQc%OmiC>|$)87#c(AgQy!b9bKNdk8;+h4<3}ypO;i&0yiJ zhuh2G2^0#OjE;kaH>n7pN8^uXu<+{ORsx=zH6Kq04;J2O#fC8(e>8)I$J0!H@a!s6 zd^iR>Xn5~b8paX)(OBX2+YjaI+teyyv8;jiLpg4bbij8k_{KWmn*_eO4)|7quPKSo zpLC-X=lU-s@l8wO;~eE(hkR+(U`{Xtl?x{@;~emv3clG6_&AeW>VS{scclY9zOT98 z0Uu|NZ#m@q*a08&JDM*-63js5HxuqN9q=){76*K62i*?%*bct!fREy5hXX!tq#bs^ z$E~+x0|4)`dq-gLk>1AK=a@J#{V8MUwy%s}Nr`EsrUzKP%q zJK$rv-0FbO2foK0@SOp^w;k{?-lI4h3L;n9;au*^&1Yt z<23R)2YjQzH)OFDrGSC*L3w|yL%!(__*j0G4){2JgdFfq2H!mn_*gFc9Po_<-%(3o zC76NA-DzXz=ZEz{mFd z8wY&Hg72uMuoBEb^}%w^cEHE;p?MDY#)0pA2Yf7-%N_7>{&JlIKIZoa4){2JJnn#x z~`kOMx>n{IKy$0hgo9q_SVKJS1p6MVmSz~=?uM-KS1 zz?Wve~FOW_?VBC4)|Ek8yxUauJt(JWBP7)$hX}AALYh#4)`*__qGE*t`|OVz{mQ{xDZx? z8K{0wfcpdod@R2L2Yft;xx@h<<=@2)_=bWnjXR9q=*U7aj1ioL_Um$A0u@hkTzn;G^6ab`h)uGf?~U!TmG`e3UOG4)|Dp zO%C|j?n4gv&H!JJ13s=(9(KS-`LfReALYTH9q@77>T|%yc969UR)QI*J{WI~13u;> z&jBCh-y#QmoJXv1z{h;7bI7;V0Uz`6EeCw;zuO$}asKy=1HLifd(QzM<4v!Jm0$*{ zH_H354*1ya&vd}Yc2(zqkLg?GkT2?h?<9nGlLJ1cZ<_-?=Jz=Vd~Bx&9P)kUfRFVt z`eIlKW}tfGxSDfu0u$gsd?$jwzyaSW;5**|AKU#phkVyL;A1&|*CF3d2Yf8QR~_(C z9=z{>kL}9S04u=^RL*SA;~elYee)dfQLdfifRA#w(E%UdpN1Upu|0py0Uz7J_Z{%D zTy{F(V}5_-fRFR50}lAuu8uh1V>`%P4lBV7R==k^;G=v#%K;zz<#`VHSk7Swd~8=S z2Yih8P6vE!_dj>Q$Mn7GfRFX@R|kAdUwR{~1T#>5Fny;xO2YhVLhaK=yP9774m0$*{HUe4h(MmBULru&cYL2y;Px! zyVRFLM`-;TyKWdo2&`LkV>Xma118pMH2n z^l-iRs&_!_%ic_%+i4wm9R!75wh$F~D%uVU@v16CyVpW@ScsSCDc5T(w8=u3S*X)O z%@*Q?TgvYu3zb>uYzxh_&>0r;S?E{`@qZhJ4=nVKh2FFfFU3@R&sgX&3-Kan<@y5)@q!pdyV*k5S%}wwD%bTE>aq}Z zwkX$S7OJxluParqehbaE5I;y2*Cp278)H@m%sUG*aZg7*uR~~BX|(jAh2vwyC4l@& z!PGSD-ETzr zz?G8bPSYlJNSepQ|JC22d@=tbq^`#}6=*E}l#U=y_%e;-wgkzkqhT zppSv>62x}#T|r*h-xqW|?E3_I?$tn zrT{S>k1-4AF+uZzo)A|5>W90^cz910jZq73G^MIy$!^% z#$)UUdPLA4fgTg|9?)%qJ^)gF4_oLH3&Fc~O|?*(h0=k(E1_fny&xzPh_ghrKcJ@t zjRD#%$OrViplqPW1x*0DL(n9kX9P_Hx?j*tpa%ra1$t1>d?1x(KhO__Rs{5IL1jQs z3aSM94?zK-HwD!Jy)Ecmpx+6)5a=yI7X$r4P!rJa1+@VEr=T_<6)zqQe(bdrzbQr* z_c;u1rb2ld*0=VBE%emk-o31iyWVum$`~c zA1240)IvbKeBN}qKDG<@Run~K_QAt6$d+&LKGM(1%Ch+oQsf%{XaE1S1axEhzn_0|2|$c##ix85tR|2r0-fSwKc>VOE9i6} zE?7J=Ih!CT7c^>;@fh=frU+U9G+j_J&`d!Kf#wK02k1;e6y0YDx(J9bXgo$E5SKk3 zqZOz`5M@-kpa@W={TXPOpuYj73;GzyD~QWnzAp6`Lt%4)>oIr*X_lbTu+`Ft&r=Z%6d?mm6XXM$ zE+`vlhM);R>{T9P63|RRd|5k7&`hA&g60Cv5i}o&qrAuP1F;`M5i-zxL1jQ^3aSJ; zOHcslY(aHE?5|LS4CEJdAyB@ci-8IRH31b0Y603Lh_9cE1a$(juX~IzP>G1ZJ-N;wjbz1L4O3I`ARkb@plqOaK@)%|anb&OIt5Jwx>OLiPPzo~ zMN&x6e4wx(KM-X!+8@wrL1jQ|1XThB1@WcPT0wO{>ja$(v{DdX6>&C-#VF7vf|`KZ z1hoL=32Fo4IN&ilfz}J+YoW^ptp)m`p!Gmk2-*O&LC_|kje@oSeM!((pr{~N#&vk2 zK}Q!e9=4jh`lE-3tttGMOJ>hKfJ(!eKJ~w(k87&Y|g|_6wjeHu z)L2G&bGpzdJw;iO4f5A4@za6L)xwZ9IsfGXAAHLo9U*VVpT`&l zTb18&Kzsp-(G+O5pm9L+1Wg1|B}o}RUucxb3k0zwuf!iDFzl-Y6~W#jh-KO>s1o+o zf&#E(f?$dC;jfwV(}1aj+`f#3qW2ip!KQBf=p)pu_u3c1@7=^fZsX2B?!$%TA2oQd zdXB_x8yQ?;i5(z)JE;fgK_QOp3jNqZ9Ay>lRttUALL9Y~D`z(fMJ&WwfTD4JrO;9f z$*e+BP-xNSS!k+-##`t_3yreSPz!yEuv8rHTj+p=-muUwE%da7c3S9R3*Bd-J1umR zh1l9vY-~A#4t`PntWiIm>ZeuxELT4lsGmCZQ>A`N)XxI-GgtjgS3hTLJa7cH8$Ky| zz!e@vYe?=6=(ks{w*5F>@g^z-vX%s_mlV5-=Jctz4ZHwu-ZXQ!ZJKIKiMwssW<$X2 zy#IU66c`u&Qrtu^sZ)k1K-)8PXxgyhBhp76<;@s%^ytiEjy*2x_!CYXbJEGD_)Z-= zE_?iGr%#v|XSdK9Ig>P=oQkp;i$82*z^0VVlvxy88pb);?+7Y~O%1-7GXoV1;^j#}Mpg#ho3wjS|q@WLgjuLbj$Sdd* zpbSBV8ym2KQh|;Zlm;|fP&!bipbVg61#$MAC5W@<;{A zMU}otsI`5CZ+S!0)Yi7P;EIMeUvo#-s)n$yqszCdH6*U!GxB|1!Am2-5QA+FQgvEz zk`+FgJ4BC_Z%sqU*WM9EC{Up0<9&AF$*t{(*%xkU4f*uVcD|-a&=>CTH3&!3WU4~+ zH3b`6LrB*Yqp%~=*3^D_7;(ythKy+KI$wJO6ecFQ@kZZ%PP}3;*cfIEpi>#M<79Jb|?uP8Z zHKUE92vA}TU2KWs-p^ZCFx=G|TpjdHKnX1JsZyUPNegwNi8Qmi7_M!O+Kkk)G+R@yku%aXJ=b$qwXu6 zZ5<7WSG9o&=peX_u`4`vc@X_2=xb$T>$t?%(cC=I>}?39qchk(wF~!j`b5E<3ck6k zW0hpU7C{Y)zoXf=3XQO9ol%FT!U|z`f`8n;*<==zvK9^joo2UajoUB$m+5v z{1ri~b2bIrkXzQo@^z|URWB)T4+p#2Q7!0i%iDsh(1^oQK9Nq&6c^%W=~ z_@HR?HFT{&zS_}mRrNEq((0+T&@2q5EQnlGM^-HlLLN4w;+l}~#&F2jg7&ehVQuTG z$SPmMDu~9gk>Bn!`)z{g>}&`@tDxkt!%UY^)zC(v40<@&2K6sm)=Euu1`$_d5WT6H zO%>g^%U4@lhPXwTT@s9!Pt8K3R_Ym!x~rh*TbPjv?H#@rG}B;LXc7dGw9|>Irn}a4 zq9F&{S3sjoT(TR5C{9)!JGrz78z0KADcIZ)X|sw9VVI*2giw+Xvt&akK_cH`v}Rik z`WhmLt{s=LqQskg5|e5#h53n<5i*hz!|*keZ$f87xMhKlLLUQBSL=$FaA?6qjNr&$ z$BOpW%MdoIlPyrBSs`@7B39B&X*#*M9ij~-VU)M8rXB$wJCTngc9m{#B7#E*%okkS z7z{Q+lEmc#lhX!a3rQ?Z+pGsvSEvQ@hh13;QOZRPtDHLMjsP|hi-nj;NIU~(X_6jv zkhk(sD8dFyEttNB6%Dw+HY^pKSZromYS9=p_F*E@$gvq$-bw>O_hOApJK;I@28dLZ zgUSvxRXwa5buuKCa1^RWYc1idL=*M+zofN;nn{tTBFKCQnYK0-Fr))Iw}>07*i>NU zdY%N?t^|z^Z?PVo!+N0el^3C)r58%kG_-LbSch6@h58=t3DdSv1kw(TunSGH9a5Q7 zATuw8NCt{)RRpEf6G4{HZn7x-A@NbmOoJL{3>I}lC@f*KZQ_P+WCRu0fHsGenGu;G z$SvR2@WVU6nT;+8rM7h}FEnE-p^8_hzCLQ!v!n)rtYFE2P3+!^x^| zx!hV_K%0XKE04LsENBHLzagW@^2Wkqr)oe=QLhWWK|+BcSWJ_YwBRM_^uv^{0)SFq z2(QajiV>n(kYQX9pv#iMM&b)M4jan3A6<9Xe$@DsM@D3G`Df&-q(GRgYDN9n9jzz^ zbTz%24MW$hNtPm54SCCsjxzXv)V&FORmI&tel9nJuxNrr#flm+D#{`d!lKsPecwm| zQ9&-qA|RXQM$uXXL&SI+x7OCKYFE2iZQoj~8yW<+R%?A*TWz(q3l;aaie1eAd1mIE zIg@)Y@M+)o?f*A?a+v!)&olEqvwmmJoS6d8y%C*-^P>yB80=O9z(LUY%S8tcyMgT; zhiR;Tw78V5Hdu_*WIC_MP;mvu59q6xU~r~W!d6iY%1}u3J?dE^ceHSNIIDgAdbB?4 zE<;m;D3+tEK?CiK)?9kxKFT;u)%EK)w6s_mj7VwtqZdRM9OFooJ*M;-DF8*5uia3% zj9DwXd)d0#O`D?tI|5mFF2d+$37%!`a%rO>)6sGvxmBkk>pVIw{eT_lPEjmrI10-c z6sCY^*{#7hc}JUM%bfdm7sUI{RDygWiez^p9@Y6dsi6QnTy*EkdO;wf4-iVSE{QsY zhJ|Bz*(NhfMfXi>2ZM8AFxyiMV#sK>Ix>(Gmo-c{@q~@1Si#nF(EEk+t>O9EBpdB; z5WoDXXtp)p9!uxb@wT+TJs49r0{&1w5YL3-nP{6!luJg@K}&96UL+E3&9`T>c~Da+ zB@X&CnQVJLo@r|@5$60snA0NWV7L|PoSloeI?4#qyi78a#h%qJR7Yzz6V1%=ugWX~aJm+>Y{N=TE$?Z61n9KIqTS%e1%7L#o=vqui~0G89x%!BW3xT9;@f3~EyB8^ch zgJGn&{U9oZQCE-_S~@S)9!LJ<{lQ=s&u(W;8flOZgk4X{+JF+_=#|Ol{qx#m%+Vl< zC{m907;Rx&3rLgU)&MT9FmwKV$lvbQ z#I_mp^0`*1*ETQ5sS$mrJ=%^0$)#*|b{?J~l5bg6fzA*r>5c=)Ci?%nOnMqp#?#6C4!6~ zhwSWxcplR_KR4SZ8V4t$w%ELO)?Jh|CQFnlsv<%I*V-QRw}#4<*+DnWlB;jZayO{0 zXloaZn`jrZWgoxY-x>|Kqk6g9#r8OowJjO$Q2MbEPWvoRRNIP$Ke zxdy@HgInm4en7F4Sxb32|-p}eJVMLVICL48WK z`Ry2#ur-_sN3&>`+iktt;!#vi^fvCu!udfhe8YsP8&8}%`|ML1CS#@?=7#L5yE?mI zLSNRfekn!=opR0wvwxT>U&E=N)7n#Q7;<1pCP#N_?sdZQDHlu;BMuB5F2qc=7|)+F zr6J83)@3-;Xw@26X_vu-Y*=C&pR_GF5diB3mRDy(+hrIduWi7T1|~|@tiNE2bz-NZ zCH<2dPVD?YJ@$4=$?;kIoZuO}xtadcA7JqdU*fortKxg$gF8Np@91jrcl4iTV+qvY za1hC$a4H?X%@s)B2YSw)$FT%wa5yz3;mE_c-On{#V6MRR2>gBjk?(z`G@KD7;S9Hi zLgo&KZ@#@AC}ACnzeg|XoKPAL*VLHlGqNO{Lj>k(JlAUYCVcEGSQ<08ttF>UrJ6dk?_4f-7qH{ zzSXB2=}4H?bi*CVjZ%QC9sB2%WT+$gmXdfK$qpsaES5~VLx4d7!o4D{yfEa(RA$a} z_{T#1Vff!m$qe4D#~&p)7dMq@rsP9z$xKQb+>%+8$TdicHJg%2_;bRULkZ(^B-5ti z7lB$b4ZqGZBxG>SgvK=CSHh4`>6{^<((?@om0oB_sPy@Ugu1LWBvg8xTQZ$G7Yqq? zzTA*d=go$MI$v!_sPo4R33a~7kWlAa3<-7qf+3;KUp6Gv`5SIY6Lr4JkWlA)3<-6< z-;hw}M+^yde$0?i=N}sq>inD`q0YZFB-Ht3LqeVZ;Fipw&aW8~>imu&q0ajZ33cXr z1E;jipw3)Hpe59qYXh`|I`fUcmQZKD(bp2{%yoZSLY>FECC${CUpY9KX6ih}kWgoS z;h-_pncp{P33c`v66(xv8#IPG^UDS;q0X&_ggW!9292T4{HDQ?%%slC3<-7S%0-Q# z&itA|OQ`cDhJ-p_VMwU+RfdE*^D71&4t2iHkWgoS!JskJncpusl3CRGHbX+4`R#(n zP-lL*pe59qD}c0wI`gXqEuqf*W<6@semW-WoZ8ao}>pDZivT=(c;S+q(kT8L0J?M~`K=&9DCeRK; zLZzQ@OGH2ToFSpkzcwVIJR1_~{Ei`^&i^nZ)R}9%91W*aXSUB;LY+TkNT_q8A)(G} zdmWbO2WJ}+>Krg6)S2z7W>M$)hJ-pVHYC)UZKh^X=Yk=j&YKJgb!L00S=9L^w?y=V zpED%XnQfiJnn9iKG9=XbhlYeYvmMhc>ilCvLY<#CB-EL0lx9)q*9-}De%CD#{UF;P zhb8*K5r%|1*BcV*%x@Gli#ks*B-DAjA)(G^8WQRpF(lMEXGo|s*UCC^$$rp~FrC*K z66(CskWlBV3<-7qm?5FgT+gcGqRzJ&66*X7LqeVZ%aBm#2i+3U4~q4YxFcGLS=5

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

K%>1AI>ijtd|8 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∋y@l=_vFB8*k)QgFn0nZ#<> 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 RC?CxV+nMlk)09a+Z3&X_o9FKOscE&Rc zht*0PIG~&mLYz3U5@!x5i#Q;Z>q>h;;$WSND6>@AYfm^BC<&<=0hR z-M`mg)m8O8e6!fx*?YcsA!Gg)b8GqR_0`4I6;qy7>~eM~N5waL0pM={7pDO(Zv$L; z4`Adm(Y4P2B;Cd*(#nXU2lzx9{efuUYXCtb9Yx3SiIjgxGJMCr#3Wd$rH#VXQ z@OPy__1m{!-+a07;;rpl*rHr*6hz~~ZoOG8mP%kSq5AvYeo!x%Q2lPx^8y9QF^!Jb zY?bRZQqWAazEH01)(s_+FinK^Y8}#1WmfAITW=S<)=sgZUWN;}9#^3i3Ej+=gYf|GB`fSEzbbwLyc%QW(|Wsd&X&yJ4tn8Pk^AxKV7k__iiKtQEYeY$VyR zPRrY`H`I8fmJ)>Z8eUV_26{Vs2PFw>>UWmQAvLumtciyWI z16f$R>ER&Qn-U+@+EKWYSZTh^AgFxqhUoMNF5D0-Drjv)*LK zOxRT^V!8@X*RYOl+G<`5?U0Q1jmDx>+*c++GpxQ$>j>5Bl{mjT|p0`PbQ z;InH0w~bOl^5c1IkL8c1upRQB&I0t$As$i<>uw-Fjdfp$h+rA<@%bTQe1PSjQ0EBr zO{8xZ0ZK?148alTfe{#mUbqHBFbKmi4r4F@8CZkUa0-sWad-;Oz)g4>2H*-@g=e7; zehX*e8JL1R%)<;Uz$DDUG~^%)i?9UG!7|LkMK}-VpdT*4I{Y41VFj+k4fq{A50~IF z{02_I$^RqrQM6A7hzi&?l?OZSz{g*=$~g{q6nB?f-4MG2W4UPJ?`r!kAHK5HJuaP| z@EhAqlGL~P^3hT2*ok#3MBxBP$Z&4>Z4y?o7&8=!V2Aasyidz|CG<;KUsa3KT(vp& z${XiRTQ;}d=I~2@z~%5nuQ@XQmLXC_jAP^QBEp-G`myXYs`v#@D|(Movt*tLpF}w~ z)J$GM(K>x8MrvX`j)*_!M@qa8d;Dfu=ZD>-fIldti;=s)y29TR1sc0F`Zv$B*4WVsppd#leU?YKIB#e`BPtYJ7 zJ4GU(aJZ=VWzdB`6C`5!6>TA9g>M^uPFO`^{0x$|gi@?*AeAYe)~12Wf+=8zFo?u` zTPNH2R*pC$+u(0_s?$52xUeqhTb{N_vEz4ral*N6kSg#}Du8^3kv`@?)0qrZO9MHeXit#zTOK7ZHR3fh_gm-=}1Wp}_i1z1qNcegBOkM}Efl z3tFHm1`UGrkk+WfZ930^&ot)6YM&Rq@1BsAl#2@t&y#ody!LJ9lkU5ac9=lO` z*>Dr>l%>4>sw8$wkK8H$#Mh$NweOTtFa}v-I|U;%`iY(L56!5j*eSot4oI@D7>nXu z$9xz`J!}4_x!`>L2LW8O<~Uy%Pt#AFPjSBZZynb4`NBAtenRgX&8Vl)JM`I2Ij9EO#<9?w~gq9b0C&F`i02e}d-QSaW9R`NZ?lA6(ehZq+k?`TAzf&A%>sgKHCtx@fD<_*t2hv3! zNvE(`@9EdfVVN%ZNGg%Rfzr>OJ@YOYy%-gO4W6R=I{UpO*C83l75#s{F@;YkG_xa!KFrX*^rEh79=pcLUeie z!(l|sj&d+oPPR84Yd2zI>C7vGNPn;8V@^1JM#rz!%J-nOs+rd94pk?4Lid1(sz*&! zl@8@_tek949cW`AH2R+&hQL=d8Jc58$8Bgj*UdrGp9+Ufo3Nu|BAr9Ba% zWH!LEIV!1lWzKP@&jnbAaHqRgYd%1-x+-isyI!pYhGiL6>KV+(_fUu?xa%BN zIUhnh6sznQ-HMOLKUuQ*<9jCATslT~-9+<0hjxSKvR|t{p8nL@6_Ud$uQ4R`8J9z) twkfVr-OyOpWF3P|v|hOw>m_n%&uJw6{h4*1{zSVXteYVu`nb*E{s*)~c7Ff> diff --git a/extern/libcurl/windows/32bit/libcurl.dll b/extern/libcurl/windows/32bit/libcurl.dll deleted file mode 100644 index 8c85d27127be256633454fdf98712e9622cbcbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344064 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 z%0A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 z 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 From bb274885165433600514f4c4a9564b3c33b284e7 Mon Sep 17 00:00:00 2001 From: James Date: Sat, 4 Apr 2020 22:54:09 -0400 Subject: [PATCH 2/5] Squashed 'extern/curl/' content from commit 509c2c2ac0 git-subtree-dir: extern/curl git-subtree-split: 509c2c2ac0963c3dc9143d9322ae15c45b960823 --- .azure-pipelines.yml | 428 + .cirrus.yml | 53 + .dir-locals.el | 10 + .gitattributes | 8 + .github/CONTRIBUTING.md | 23 + .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE | 19 + .github/lock.yml | 8 + .github/stale.yml | 17 + .github/workflows/cpp.yml | 17 + .github/workflows/fuzz.yml | 23 + .gitignore | 60 + .lgtm.yml | 10 + .mailmap | 61 + .travis.yml | 441 + CHANGES | 7 + CMake/CMakeConfigurableFile.in | 1 + CMake/CurlSymbolHiding.cmake | 55 + CMake/CurlTests.c | 617 ++ CMake/FindBearSSL.cmake | 9 + CMake/FindBrotli.cmake | 20 + CMake/FindCARES.cmake | 24 + CMake/FindGSS.cmake | 289 + CMake/FindLibSSH2.cmake | 22 + CMake/FindMbedTLS.cmake | 13 + CMake/FindNGHTTP2.cmake | 18 + CMake/FindNSS.cmake | 17 + CMake/Macros.cmake | 88 + CMake/OtherTests.cmake | 264 + CMake/Platforms/WindowsCache.cmake | 123 + CMake/Utilities.cmake | 12 + CMake/cmake_uninstall.cmake.in | 26 + CMake/curl-config.cmake.in | 12 + CMakeLists.txt | 1423 ++++ COPYING | 22 + GIT-INFO | 44 + MacOSX-Framework | 137 + Makefile.am | 728 ++ Makefile.dist | 127 + README | 57 + README.md | 86 + RELEASE-NOTES | 80 + SECURITY.md | 10 + acinclude.m4 | 2572 ++++++ appveyor.yml | 218 + buildconf | 448 + buildconf.bat | 317 + configure.ac | 4918 +++++++++++ curl-config.in | 194 + docs/.gitignore | 4 + docs/ALTSVC.md | 39 + docs/BINDINGS.md | 127 + docs/BUG-BOUNTY.md | 106 + docs/BUGS | 302 + docs/CHECKSRC.md | 162 + docs/CIPHERS.md | 516 ++ docs/CMakeLists.txt | 3 + docs/CODE_OF_CONDUCT.md | 32 + docs/CODE_STYLE.md | 246 + docs/CONTRIBUTE.md | 267 + docs/CURL-DISABLE.md | 110 + docs/DEPRECATE.md | 12 + docs/ESNI.md | 139 + docs/EXPERIMENTAL.md | 22 + docs/FAQ | 1558 ++++ docs/FEATURES | 204 + docs/GOVERNANCE.md | 167 + docs/HELP-US.md | 70 + docs/HISTORY.md | 359 + docs/HTTP-COOKIES.md | 134 + docs/HTTP2.md | 127 + docs/HTTP3.md | 115 + docs/INSTALL | 9 + docs/INSTALL.cmake | 90 + docs/INSTALL.md | 509 ++ docs/INTERNALS.md | 1099 +++ docs/KNOWN_BUGS | 758 ++ docs/LICENSE-MIXING.md | 128 + docs/MAIL-ETIQUETTE | 285 + docs/MANUAL.md | 1011 +++ docs/Makefile.am | 124 + docs/PARALLEL-TRANSFERS.md | 58 + docs/README.cmake | 16 + docs/README.md | 12 + docs/README.netware | 24 + docs/README.win32 | 23 + docs/RELEASE-PROCEDURE.md | 106 + docs/RESOURCES | 85 + docs/ROADMAP.md | 63 + docs/SECURITY-PROCESS.md | 132 + docs/SSL-PROBLEMS.md | 87 + docs/SSLCERTS.md | 173 + docs/THANKS | 2139 +++++ docs/THANKS-filter | 101 + docs/TODO | 1186 +++ docs/TheArtOfHttpScripting | 758 ++ docs/VERSIONS | 56 + docs/cmdline-opts/CMakeLists.txt | 12 + docs/cmdline-opts/MANPAGE.md | 52 + docs/cmdline-opts/Makefile.am | 34 + docs/cmdline-opts/Makefile.inc | 215 + docs/cmdline-opts/abstract-unix-socket.d | 9 + docs/cmdline-opts/alt-svc.d | 17 + docs/cmdline-opts/anyauth.d | 17 + docs/cmdline-opts/append.d | 8 + docs/cmdline-opts/basic.d | 11 + docs/cmdline-opts/cacert.d | 33 + docs/cmdline-opts/capath.d | 15 + docs/cmdline-opts/cert-status.d | 13 + docs/cmdline-opts/cert-type.d | 10 + docs/cmdline-opts/cert.d | 50 + docs/cmdline-opts/ciphers.d | 11 + docs/cmdline-opts/compressed-ssh.d | 7 + docs/cmdline-opts/compressed.d | 7 + docs/cmdline-opts/config.d | 61 + docs/cmdline-opts/connect-timeout.d | 11 + docs/cmdline-opts/connect-to.d | 21 + docs/cmdline-opts/continue-at.d | 15 + docs/cmdline-opts/cookie-jar.d | 24 + docs/cmdline-opts/cookie.d | 37 + docs/cmdline-opts/create-dirs.d | 11 + docs/cmdline-opts/crlf.d | 7 + docs/cmdline-opts/crlfile.d | 10 + docs/cmdline-opts/data-ascii.d | 6 + docs/cmdline-opts/data-binary.d | 18 + docs/cmdline-opts/data-raw.d | 9 + docs/cmdline-opts/data-urlencode.d | 33 + docs/cmdline-opts/data.d | 29 + docs/cmdline-opts/delegation.d | 16 + docs/cmdline-opts/digest.d | 11 + docs/cmdline-opts/disable-eprt.d | 19 + docs/cmdline-opts/disable-epsv.d | 16 + docs/cmdline-opts/disable.d | 7 + docs/cmdline-opts/disallow-username-in-url.d | 7 + docs/cmdline-opts/dns-interface.d | 11 + docs/cmdline-opts/dns-ipv4-addr.d | 11 + docs/cmdline-opts/dns-ipv6-addr.d | 11 + docs/cmdline-opts/dns-servers.d | 10 + docs/cmdline-opts/doh-url.d | 10 + docs/cmdline-opts/dump-header.d | 20 + docs/cmdline-opts/egd-file.d | 8 + docs/cmdline-opts/engine.d | 8 + docs/cmdline-opts/etag-compare.d | 18 + docs/cmdline-opts/etag-save.d | 16 + docs/cmdline-opts/expect100-timeout.d | 11 + docs/cmdline-opts/fail-early.d | 21 + docs/cmdline-opts/fail.d | 14 + docs/cmdline-opts/false-start.d | 12 + docs/cmdline-opts/form-string.d | 11 + docs/cmdline-opts/form.d | 138 + docs/cmdline-opts/ftp-account.d | 10 + docs/cmdline-opts/ftp-alternative-to-user.d | 10 + docs/cmdline-opts/ftp-create-dirs.d | 8 + docs/cmdline-opts/ftp-method.d | 21 + docs/cmdline-opts/ftp-pasv.d | 16 + docs/cmdline-opts/ftp-port.d | 32 + docs/cmdline-opts/ftp-pret.d | 8 + docs/cmdline-opts/ftp-skip-pasv-ip.d | 12 + docs/cmdline-opts/ftp-ssl-ccc-mode.d | 11 + docs/cmdline-opts/ftp-ssl-ccc.d | 10 + docs/cmdline-opts/ftp-ssl-control.d | 8 + docs/cmdline-opts/gen.pl | 390 + docs/cmdline-opts/get.d | 15 + docs/cmdline-opts/globoff.d | 8 + docs/cmdline-opts/happy-eyeballs-timeout-ms.d | 17 + docs/cmdline-opts/haproxy-protocol.d | 11 + docs/cmdline-opts/head.d | 8 + docs/cmdline-opts/header.d | 41 + docs/cmdline-opts/help.d | 6 + docs/cmdline-opts/hostpubmd5.d | 9 + docs/cmdline-opts/http0.9.d | 13 + docs/cmdline-opts/http1.0.d | 10 + docs/cmdline-opts/http1.1.d | 8 + docs/cmdline-opts/http2-prior-knowledge.d | 12 + docs/cmdline-opts/http2.d | 11 + docs/cmdline-opts/http3.d | 19 + docs/cmdline-opts/ignore-content-length.d | 10 + docs/cmdline-opts/include.d | 10 + docs/cmdline-opts/insecure.d | 16 + docs/cmdline-opts/interface.d | 16 + docs/cmdline-opts/ipv4.d | 12 + docs/cmdline-opts/ipv6.d | 12 + docs/cmdline-opts/junk-session-cookies.d | 10 + docs/cmdline-opts/keepalive-time.d | 13 + docs/cmdline-opts/key-type.d | 9 + docs/cmdline-opts/key.d | 17 + docs/cmdline-opts/krb.d | 11 + docs/cmdline-opts/libcurl.d | 11 + docs/cmdline-opts/limit-rate.d | 18 + docs/cmdline-opts/list-only.d | 24 + docs/cmdline-opts/local-port.d | 9 + docs/cmdline-opts/location-trusted.d | 9 + docs/cmdline-opts/location.d | 25 + docs/cmdline-opts/login-options.d | 14 + docs/cmdline-opts/mail-auth.d | 10 + docs/cmdline-opts/mail-from.d | 8 + docs/cmdline-opts/mail-rcpt-allowfails.d | 15 + docs/cmdline-opts/mail-rcpt.d | 19 + docs/cmdline-opts/manual.d | 5 + docs/cmdline-opts/max-filesize.d | 16 + docs/cmdline-opts/max-redirs.d | 10 + docs/cmdline-opts/max-time.d | 13 + docs/cmdline-opts/metalink.d | 26 + docs/cmdline-opts/negotiate.d | 15 + docs/cmdline-opts/netrc-file.d | 12 + docs/cmdline-opts/netrc-optional.d | 7 + docs/cmdline-opts/netrc.d | 17 + docs/cmdline-opts/next.d | 20 + docs/cmdline-opts/no-alpn.d | 11 + docs/cmdline-opts/no-buffer.d | 11 + docs/cmdline-opts/no-keepalive.d | 8 + docs/cmdline-opts/no-npn.d | 12 + docs/cmdline-opts/no-progress-meter.d | 10 + docs/cmdline-opts/no-sessionid.d | 13 + docs/cmdline-opts/noproxy.d | 15 + docs/cmdline-opts/ntlm-wb.d | 7 + docs/cmdline-opts/ntlm.d | 18 + docs/cmdline-opts/oauth2-bearer.d | 12 + docs/cmdline-opts/output.d | 32 + docs/cmdline-opts/page-footer | 256 + docs/cmdline-opts/page-header | 141 + docs/cmdline-opts/parallel-immediate.d | 9 + docs/cmdline-opts/parallel-max.d | 9 + docs/cmdline-opts/parallel.d | 7 + docs/cmdline-opts/pass.d | 8 + docs/cmdline-opts/path-as-is.d | 7 + docs/cmdline-opts/pinnedpubkey.d | 25 + docs/cmdline-opts/post301.d | 11 + docs/cmdline-opts/post302.d | 11 + docs/cmdline-opts/post303.d | 10 + docs/cmdline-opts/preproxy.d | 22 + docs/cmdline-opts/progress-bar.d | 12 + docs/cmdline-opts/proto-default.d | 18 + docs/cmdline-opts/proto-redir.d | 18 + docs/cmdline-opts/proto.d | 43 + docs/cmdline-opts/proxy-anyauth.d | 7 + docs/cmdline-opts/proxy-basic.d | 7 + docs/cmdline-opts/proxy-cacert.d | 7 + docs/cmdline-opts/proxy-capath.d | 7 + docs/cmdline-opts/proxy-cert-type.d | 6 + docs/cmdline-opts/proxy-cert.d | 6 + docs/cmdline-opts/proxy-ciphers.d | 6 + docs/cmdline-opts/proxy-crlfile.d | 6 + docs/cmdline-opts/proxy-digest.d | 6 + docs/cmdline-opts/proxy-header.d | 24 + docs/cmdline-opts/proxy-insecure.d | 5 + docs/cmdline-opts/proxy-key-type.d | 6 + docs/cmdline-opts/proxy-key.d | 5 + docs/cmdline-opts/proxy-negotiate.d | 8 + docs/cmdline-opts/proxy-ntlm.d | 6 + docs/cmdline-opts/proxy-pass.d | 6 + docs/cmdline-opts/proxy-pinnedpubkey.d | 16 + docs/cmdline-opts/proxy-service-name.d | 6 + docs/cmdline-opts/proxy-ssl-allow-beast.d | 5 + docs/cmdline-opts/proxy-tls13-ciphers.d | 16 + docs/cmdline-opts/proxy-tlsauthtype.d | 6 + docs/cmdline-opts/proxy-tlspassword.d | 6 + docs/cmdline-opts/proxy-tlsuser.d | 6 + docs/cmdline-opts/proxy-tlsv1.d | 5 + docs/cmdline-opts/proxy-user.d | 18 + docs/cmdline-opts/proxy.d | 39 + docs/cmdline-opts/proxy1.0.d | 10 + docs/cmdline-opts/proxytunnel.d | 12 + docs/cmdline-opts/pubkey.d | 14 + docs/cmdline-opts/quote.d | 57 + docs/cmdline-opts/random-file.d | 7 + docs/cmdline-opts/range.d | 46 + docs/cmdline-opts/raw.d | 7 + docs/cmdline-opts/referer.d | 14 + docs/cmdline-opts/remote-header-name.d | 19 + docs/cmdline-opts/remote-name-all.d | 8 + docs/cmdline-opts/remote-name.d | 21 + docs/cmdline-opts/remote-time.d | 7 + docs/cmdline-opts/request-target.d | 9 + docs/cmdline-opts/request.d | 39 + docs/cmdline-opts/resolve.d | 27 + docs/cmdline-opts/retry-connrefused.d | 6 + docs/cmdline-opts/retry-delay.d | 11 + docs/cmdline-opts/retry-max-time.d | 13 + docs/cmdline-opts/retry.d | 20 + docs/cmdline-opts/sasl-authzid.d | 11 + docs/cmdline-opts/sasl-ir.d | 5 + docs/cmdline-opts/service-name.d | 8 + docs/cmdline-opts/show-error.d | 5 + docs/cmdline-opts/silent.d | 11 + docs/cmdline-opts/socks4.d | 19 + docs/cmdline-opts/socks4a.d | 19 + docs/cmdline-opts/socks5-basic.d | 7 + docs/cmdline-opts/socks5-gssapi-nec.d | 8 + docs/cmdline-opts/socks5-gssapi-service.d | 12 + docs/cmdline-opts/socks5-gssapi.d | 8 + docs/cmdline-opts/socks5-hostname.d | 19 + docs/cmdline-opts/socks5.d | 21 + docs/cmdline-opts/speed-limit.d | 10 + docs/cmdline-opts/speed-time.d | 13 + docs/cmdline-opts/ssl-allow-beast.d | 9 + docs/cmdline-opts/ssl-no-revoke.d | 7 + docs/cmdline-opts/ssl-reqd.d | 9 + docs/cmdline-opts/ssl.d | 12 + docs/cmdline-opts/sslv2.d | 13 + docs/cmdline-opts/sslv3.d | 13 + docs/cmdline-opts/stderr.d | 8 + docs/cmdline-opts/styled-output.d | 6 + docs/cmdline-opts/suppress-connect-headers.d | 8 + docs/cmdline-opts/tcp-fastopen.d | 5 + docs/cmdline-opts/tcp-nodelay.d | 9 + docs/cmdline-opts/telnet-option.d | 12 + docs/cmdline-opts/tftp-blksize.d | 11 + docs/cmdline-opts/tftp-no-options.d | 10 + docs/cmdline-opts/time-cond.d | 17 + docs/cmdline-opts/tls-max.d | 24 + docs/cmdline-opts/tls13-ciphers.d | 16 + docs/cmdline-opts/tlsauthtype.d | 10 + docs/cmdline-opts/tlspassword.d | 8 + docs/cmdline-opts/tlsuser.d | 9 + docs/cmdline-opts/tlsv1.0.d | 10 + docs/cmdline-opts/tlsv1.1.d | 10 + docs/cmdline-opts/tlsv1.2.d | 10 + docs/cmdline-opts/tlsv1.3.d | 10 + docs/cmdline-opts/tlsv1.d | 12 + docs/cmdline-opts/tr-encoding.d | 7 + docs/cmdline-opts/trace-ascii.d | 14 + docs/cmdline-opts/trace-time.d | 5 + docs/cmdline-opts/trace.d | 11 + docs/cmdline-opts/unix-socket.d | 7 + docs/cmdline-opts/upload-file.d | 33 + docs/cmdline-opts/url.d | 15 + docs/cmdline-opts/use-ascii.d | 8 + docs/cmdline-opts/user-agent.d | 12 + docs/cmdline-opts/user.d | 39 + docs/cmdline-opts/verbose.d | 19 + docs/cmdline-opts/version.d | 60 + docs/cmdline-opts/write-out.d | 154 + docs/cmdline-opts/xattr.d | 8 + docs/curl-config.1 | 102 + docs/examples/.gitignore | 91 + docs/examples/10-at-a-time.c | 150 + docs/examples/Makefile.am | 70 + docs/examples/Makefile.example | 53 + docs/examples/Makefile.inc | 48 + docs/examples/Makefile.m32 | 366 + docs/examples/Makefile.netware | 415 + docs/examples/README | 38 + docs/examples/adddocsref.pl | 35 + docs/examples/altsvc.c | 56 + docs/examples/anyauthput.c | 171 + docs/examples/asiohiper.cpp | 496 ++ docs/examples/cacertinmem.c | 181 + docs/examples/certinfo.c | 85 + docs/examples/chkspeed.c | 213 + docs/examples/cookie_interface.c | 140 + docs/examples/crawler.c | 216 + docs/examples/curlgtk.c | 106 + docs/examples/curlx.c | 574 ++ docs/examples/debug.c | 154 + docs/examples/ephiperfifo.c | 547 ++ docs/examples/evhiperfifo.c | 448 + docs/examples/externalsocket.c | 174 + docs/examples/fileupload.c | 89 + docs/examples/fopen.c | 546 ++ docs/examples/ftp-wildcard.c | 150 + docs/examples/ftpget.c | 92 + docs/examples/ftpgetinfo.c | 90 + docs/examples/ftpgetresp.c | 77 + docs/examples/ftpsget.c | 99 + docs/examples/ftpupload.c | 139 + docs/examples/ftpuploadfrommem.c | 124 + docs/examples/ftpuploadresume.c | 161 + docs/examples/getinfo.c | 52 + docs/examples/getinmemory.c | 116 + docs/examples/getredirect.c | 70 + docs/examples/ghiper.c | 436 + docs/examples/hiperfifo.c | 458 + docs/examples/href_extractor.c | 86 + docs/examples/htmltidy.c | 128 + docs/examples/htmltitle.cpp | 294 + docs/examples/http-post.c | 59 + docs/examples/http2-download.c | 290 + docs/examples/http2-pushinmemory.c | 188 + docs/examples/http2-serverpush.c | 334 + docs/examples/http2-upload.c | 347 + docs/examples/http3-present.c | 47 + docs/examples/http3.c | 54 + docs/examples/httpcustomheader.c | 70 + docs/examples/httpput.c | 124 + docs/examples/https.c | 78 + docs/examples/imap-append.c | 132 + docs/examples/imap-authzid.c | 71 + docs/examples/imap-copy.c | 71 + docs/examples/imap-create.c | 67 + docs/examples/imap-delete.c | 67 + docs/examples/imap-examine.c | 67 + docs/examples/imap-fetch.c | 65 + docs/examples/imap-list.c | 66 + docs/examples/imap-lsub.c | 68 + docs/examples/imap-multi.c | 173 + docs/examples/imap-noop.c | 67 + docs/examples/imap-search.c | 71 + docs/examples/imap-ssl.c | 92 + docs/examples/imap-store.c | 82 + docs/examples/imap-tls.c | 92 + docs/examples/makefile.dj | 55 + docs/examples/multi-app.c | 177 + docs/examples/multi-debugcallback.c | 231 + docs/examples/multi-double.c | 143 + docs/examples/multi-event.c | 240 + docs/examples/multi-formadd.c | 171 + docs/examples/multi-poll.c | 76 + docs/examples/multi-post.c | 167 + docs/examples/multi-single.c | 111 + docs/examples/multi-uv.c | 235 + docs/examples/multithread.c | 94 + docs/examples/opensslthreadlock.c | 95 + docs/examples/parseurl.c | 78 + docs/examples/persistent.c | 68 + docs/examples/pop3-authzid.c | 70 + docs/examples/pop3-dele.c | 70 + docs/examples/pop3-list.c | 64 + docs/examples/pop3-multi.c | 173 + docs/examples/pop3-noop.c | 70 + docs/examples/pop3-retr.c | 64 + docs/examples/pop3-ssl.c | 91 + docs/examples/pop3-stat.c | 70 + docs/examples/pop3-tls.c | 91 + docs/examples/pop3-top.c | 67 + docs/examples/pop3-uidl.c | 67 + docs/examples/post-callback.c | 154 + docs/examples/postinmemory.c | 112 + docs/examples/postit2-formadd.c | 106 + docs/examples/postit2.c | 102 + docs/examples/progressfunc.c | 144 + docs/examples/resolve.c | 56 + docs/examples/rtsp.c | 288 + docs/examples/sampleconv.c | 112 + docs/examples/sendrecv.c | 161 + docs/examples/sepheaders.c | 94 + docs/examples/sessioninfo.c | 109 + docs/examples/sftpget.c | 110 + docs/examples/sftpuploadresume.c | 135 + docs/examples/shared-connection-cache.c | 85 + docs/examples/simple.c | 51 + docs/examples/simplepost.c | 57 + docs/examples/simplessl.c | 141 + docs/examples/smooth-gtk-thread.c | 224 + docs/examples/smtp-authzid.c | 161 + docs/examples/smtp-expn.c | 79 + docs/examples/smtp-mail.c | 149 + docs/examples/smtp-mime.c | 163 + docs/examples/smtp-multi.c | 243 + docs/examples/smtp-ssl.c | 169 + docs/examples/smtp-tls.c | 171 + docs/examples/smtp-vrfy.c | 79 + docs/examples/sslbackend.c | 77 + docs/examples/synctime.c | 375 + docs/examples/threaded-shared-conn.c | 156 + docs/examples/threaded-ssl.c | 166 + docs/examples/url2file.c | 86 + docs/examples/urlapi.c | 72 + docs/examples/usercertinmem.c | 226 + docs/examples/version-check.pl | 103 + docs/examples/xmlstream.c | 166 + docs/libcurl/.gitignore | 4 + docs/libcurl/ABI | 68 + docs/libcurl/CMakeLists.txt | 55 + docs/libcurl/Makefile.am | 78 + docs/libcurl/Makefile.inc | 85 + docs/libcurl/curl_easy_cleanup.3 | 71 + docs/libcurl/curl_easy_duphandle.3 | 53 + docs/libcurl/curl_easy_escape.3 | 67 + docs/libcurl/curl_easy_getinfo.3 | 280 + docs/libcurl/curl_easy_init.3 | 59 + docs/libcurl/curl_easy_pause.3 | 103 + docs/libcurl/curl_easy_perform.3 | 74 + docs/libcurl/curl_easy_recv.3 | 84 + docs/libcurl/curl_easy_reset.3 | 44 + docs/libcurl/curl_easy_send.3 | 75 + docs/libcurl/curl_easy_setopt.3 | 649 ++ docs/libcurl/curl_easy_strerror.3 | 40 + docs/libcurl/curl_easy_unescape.3 | 54 + docs/libcurl/curl_easy_upkeep.3 | 77 + docs/libcurl/curl_escape.3 | 48 + docs/libcurl/curl_formadd.3 | 267 + docs/libcurl/curl_formfree.3 | 51 + docs/libcurl/curl_formget.3 | 71 + docs/libcurl/curl_free.3 | 38 + docs/libcurl/curl_getdate.3 | 110 + docs/libcurl/curl_getenv.3 | 49 + docs/libcurl/curl_global_cleanup.3 | 55 + docs/libcurl/curl_global_init.3 | 103 + docs/libcurl/curl_global_init_mem.3 | 66 + docs/libcurl/curl_global_sslset.3 | 102 + docs/libcurl/curl_mime_addpart.3 | 66 + docs/libcurl/curl_mime_data.3 | 69 + docs/libcurl/curl_mime_data_cb.3 | 167 + docs/libcurl/curl_mime_encoder.3 | 97 + docs/libcurl/curl_mime_filedata.3 | 84 + docs/libcurl/curl_mime_filename.3 | 72 + docs/libcurl/curl_mime_free.3 | 50 + docs/libcurl/curl_mime_headers.3 | 65 + docs/libcurl/curl_mime_init.3 | 69 + docs/libcurl/curl_mime_name.3 | 63 + docs/libcurl/curl_mime_subparts.3 | 53 + docs/libcurl/curl_mime_type.3 | 83 + docs/libcurl/curl_mprintf.3 | 103 + docs/libcurl/curl_multi_add_handle.3 | 71 + docs/libcurl/curl_multi_assign.3 | 63 + docs/libcurl/curl_multi_cleanup.3 | 50 + docs/libcurl/curl_multi_fdset.3 | 84 + docs/libcurl/curl_multi_info_read.3 | 94 + docs/libcurl/curl_multi_init.3 | 39 + docs/libcurl/curl_multi_perform.3 | 130 + docs/libcurl/curl_multi_poll.3 | 117 + docs/libcurl/curl_multi_remove_handle.3 | 47 + docs/libcurl/curl_multi_setopt.3 | 80 + docs/libcurl/curl_multi_socket.3 | 159 + docs/libcurl/curl_multi_socket_action.3 | 96 + docs/libcurl/curl_multi_socket_all.3 | 1 + docs/libcurl/curl_multi_strerror.3 | 37 + docs/libcurl/curl_multi_timeout.3 | 78 + docs/libcurl/curl_multi_wait.3 | 123 + docs/libcurl/curl_multi_wakeup.3 | 86 + docs/libcurl/curl_share_cleanup.3 | 42 + docs/libcurl/curl_share_init.3 | 43 + docs/libcurl/curl_share_setopt.3 | 114 + docs/libcurl/curl_share_strerror.3 | 37 + docs/libcurl/curl_slist_append.3 | 72 + docs/libcurl/curl_slist_free_all.3 | 55 + docs/libcurl/curl_strequal.3 | 51 + docs/libcurl/curl_strnequal.3 | 1 + docs/libcurl/curl_unescape.3 | 48 + docs/libcurl/curl_url.3 | 53 + docs/libcurl/curl_url_cleanup.3 | 44 + docs/libcurl/curl_url_dup.3 | 52 + docs/libcurl/curl_url_get.3 | 115 + docs/libcurl/curl_url_set.3 | 146 + docs/libcurl/curl_version.3 | 39 + docs/libcurl/curl_version_info.3 | 201 + docs/libcurl/getinfo-times | 27 + docs/libcurl/libcurl-easy.3 | 58 + docs/libcurl/libcurl-env.3 | 89 + docs/libcurl/libcurl-errors.3 | 362 + docs/libcurl/libcurl-multi.3 | 180 + docs/libcurl/libcurl-security.3 | 341 + docs/libcurl/libcurl-share.3 | 65 + docs/libcurl/libcurl-thread.3 | 107 + docs/libcurl/libcurl-tutorial.3 | 1397 ++++ docs/libcurl/libcurl-url.3 | 137 + docs/libcurl/libcurl.3 | 227 + docs/libcurl/libcurl.m4 | 272 + docs/libcurl/mksymbolsmanpage.pl | 93 + docs/libcurl/opts/CMakeLists.txt | 12 + docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 | 69 + docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 | 64 + .../libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3 | 66 + docs/libcurl/opts/CURLINFO_CERTINFO.3 | 81 + docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 | 68 + docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 | 61 + docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3 | 62 + .../opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 | 65 + .../opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 | 62 + .../opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 | 64 + .../opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 | 61 + docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 | 65 + docs/libcurl/opts/CURLINFO_COOKIELIST.3 | 77 + docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 | 63 + docs/libcurl/opts/CURLINFO_FILETIME.3 | 69 + docs/libcurl/opts/CURLINFO_FILETIME_T.3 | 71 + docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 | 65 + docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 | 61 + docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 | 70 + docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 | 61 + docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 | 57 + docs/libcurl/opts/CURLINFO_LASTSOCKET.3 | 71 + docs/libcurl/opts/CURLINFO_LOCAL_IP.3 | 68 + docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 | 65 + docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 | 61 + .../libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3 | 62 + docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 | 61 + docs/libcurl/opts/CURLINFO_OS_ERRNO.3 | 58 + docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 | 64 + .../opts/CURLINFO_PRETRANSFER_TIME_T.3 | 66 + docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 | 67 + docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 | 56 + docs/libcurl/opts/CURLINFO_PRIVATE.3 | 60 + docs/libcurl/opts/CURLINFO_PROTOCOL.3 | 64 + docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 | 71 + .../opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 | 57 + docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 | 55 + docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 | 61 + docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3 | 63 + docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 | 62 + docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 | 59 + docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 | 60 + docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 | 63 + docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 | 54 + docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 | 56 + docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 | 59 + docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 | 61 + docs/libcurl/opts/CURLINFO_SCHEME.3 | 62 + docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 | 67 + docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 | 64 + docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 | 62 + docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 | 59 + docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 | 62 + docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 | 59 + docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 | 61 + docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 | 58 + docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 | 60 + docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 | 57 + .../opts/CURLINFO_STARTTRANSFER_TIME.3 | 63 + .../opts/CURLINFO_STARTTRANSFER_TIME_T.3 | 65 + docs/libcurl/opts/CURLINFO_TLS_SESSION.3 | 70 + docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 | 168 + docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 | 62 + docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3 | 63 + .../opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 | 54 + .../CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 | 53 + docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 | 65 + .../opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 | 56 + .../opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 | 62 + .../opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 | 57 + .../opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 | 54 + docs/libcurl/opts/CURLMOPT_PIPELINING.3 | 89 + .../opts/CURLMOPT_PIPELINING_SERVER_BL.3 | 62 + .../opts/CURLMOPT_PIPELINING_SITE_BL.3 | 58 + docs/libcurl/opts/CURLMOPT_PUSHDATA.3 | 79 + docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 | 133 + docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 | 76 + docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 | 110 + docs/libcurl/opts/CURLMOPT_TIMERDATA.3 | 82 + docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 | 107 + .../opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 | 58 + docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 | 54 + docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 | 104 + docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 | 55 + docs/libcurl/opts/CURLOPT_ALTSVC.3 | 63 + docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 | 92 + docs/libcurl/opts/CURLOPT_APPEND.3 | 55 + docs/libcurl/opts/CURLOPT_AUTOREFERER.3 | 60 + docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 | 65 + docs/libcurl/opts/CURLOPT_CAINFO.3 | 83 + docs/libcurl/opts/CURLOPT_CAPATH.3 | 69 + docs/libcurl/opts/CURLOPT_CERTINFO.3 | 78 + .../libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 | 141 + docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 | 90 + .../libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 | 71 + docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 | 55 + .../opts/CURLOPT_CLOSESOCKETFUNCTION.3 | 66 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 | 65 + docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 | 64 + docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 | 66 + docs/libcurl/opts/CURLOPT_CONNECT_TO.3 | 111 + .../opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 | 101 + .../opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 | 99 + .../opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 | 100 + docs/libcurl/opts/CURLOPT_COOKIE.3 | 83 + docs/libcurl/opts/CURLOPT_COOKIEFILE.3 | 87 + docs/libcurl/opts/CURLOPT_COOKIEJAR.3 | 78 + docs/libcurl/opts/CURLOPT_COOKIELIST.3 | 124 + docs/libcurl/opts/CURLOPT_COOKIESESSION.3 | 66 + docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 | 70 + docs/libcurl/opts/CURLOPT_CRLF.3 | 56 + docs/libcurl/opts/CURLOPT_CRLFILE.3 | 72 + docs/libcurl/opts/CURLOPT_CURLU.3 | 69 + docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 | 111 + docs/libcurl/opts/CURLOPT_DEBUGDATA.3 | 45 + docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 | 187 + docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 | 82 + docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 | 73 + .../opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3 | 56 + docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 | 73 + docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 | 59 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 | 62 + docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 | 62 + docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 | 67 + .../opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 | 69 + .../opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 | 62 + docs/libcurl/opts/CURLOPT_DOH_URL.3 | 71 + docs/libcurl/opts/CURLOPT_EGDSOCKET.3 | 56 + docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 | 92 + .../opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 | 59 + docs/libcurl/opts/CURLOPT_FAILONERROR.3 | 67 + docs/libcurl/opts/CURLOPT_FILETIME.3 | 64 + docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 | 64 + docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 | 74 + docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 | 81 + docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 | 59 + docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 | 59 + docs/libcurl/opts/CURLOPT_FTPPORT.3 | 83 + docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 | 63 + docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 | 60 + .../opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 | 64 + .../opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 | 81 + docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 | 73 + .../opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 | 62 + docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 | 63 + docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 | 64 + docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 | 47 + docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 | 60 + docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 | 58 + docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 | 60 + .../opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 | 59 + docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3 | 57 + docs/libcurl/opts/CURLOPT_HEADER.3 | 69 + docs/libcurl/opts/CURLOPT_HEADERDATA.3 | 78 + docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 | 117 + docs/libcurl/opts/CURLOPT_HEADEROPT.3 | 76 + docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 | 58 + docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 | 71 + docs/libcurl/opts/CURLOPT_HTTPAUTH.3 | 132 + docs/libcurl/opts/CURLOPT_HTTPGET.3 | 64 + docs/libcurl/opts/CURLOPT_HTTPHEADER.3 | 124 + docs/libcurl/opts/CURLOPT_HTTPPOST.3 | 82 + docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 | 68 + .../opts/CURLOPT_HTTP_CONTENT_DECODING.3 | 57 + .../opts/CURLOPT_HTTP_TRANSFER_DECODING.3 | 56 + docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 | 93 + .../opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 | 67 + docs/libcurl/opts/CURLOPT_INFILESIZE.3 | 71 + docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 | 72 + docs/libcurl/opts/CURLOPT_INTERFACE.3 | 72 + docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 | 58 + .../libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 | 84 + docs/libcurl/opts/CURLOPT_IOCTLDATA.3 | 60 + docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 | 92 + docs/libcurl/opts/CURLOPT_IPRESOLVE.3 | 64 + docs/libcurl/opts/CURLOPT_ISSUERCERT.3 | 69 + .../opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 | 61 + docs/libcurl/opts/CURLOPT_KEYPASSWD.3 | 61 + docs/libcurl/opts/CURLOPT_KRBLEVEL.3 | 59 + docs/libcurl/opts/CURLOPT_LOCALPORT.3 | 56 + docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 | 60 + docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 | 64 + docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 | 60 + docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 | 59 + docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 | 69 + docs/libcurl/opts/CURLOPT_MAIL_FROM.3 | 62 + docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 | 73 + .../opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3 | 71 + docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 | 65 + docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 | 68 + docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 | 61 + docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 | 62 + docs/libcurl/opts/CURLOPT_MAXREDIRS.3 | 64 + .../opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 | 58 + .../opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 | 60 + docs/libcurl/opts/CURLOPT_MIMEPOST.3 | 52 + docs/libcurl/opts/CURLOPT_NETRC.3 | 84 + docs/libcurl/opts/CURLOPT_NETRC_FILE.3 | 60 + .../opts/CURLOPT_NEW_DIRECTORY_PERMS.3 | 57 + docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 | 56 + docs/libcurl/opts/CURLOPT_NOBODY.3 | 60 + docs/libcurl/opts/CURLOPT_NOPROGRESS.3 | 59 + docs/libcurl/opts/CURLOPT_NOPROXY.3 | 81 + docs/libcurl/opts/CURLOPT_NOSIGNAL.3 | 55 + docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 | 81 + .../libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 | 125 + docs/libcurl/opts/CURLOPT_PASSWORD.3 | 63 + docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 | 64 + docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 | 128 + docs/libcurl/opts/CURLOPT_PIPEWAIT.3 | 63 + docs/libcurl/opts/CURLOPT_PORT.3 | 59 + docs/libcurl/opts/CURLOPT_POST.3 | 90 + docs/libcurl/opts/CURLOPT_POSTFIELDS.3 | 88 + docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 | 62 + .../opts/CURLOPT_POSTFIELDSIZE_LARGE.3 | 64 + docs/libcurl/opts/CURLOPT_POSTQUOTE.3 | 64 + docs/libcurl/opts/CURLOPT_POSTREDIR.3 | 73 + docs/libcurl/opts/CURLOPT_PREQUOTE.3 | 66 + docs/libcurl/opts/CURLOPT_PRE_PROXY.3 | 79 + docs/libcurl/opts/CURLOPT_PRIVATE.3 | 61 + docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 | 44 + docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 | 87 + docs/libcurl/opts/CURLOPT_PROTOCOLS.3 | 93 + docs/libcurl/opts/CURLOPT_PROXY.3 | 116 + docs/libcurl/opts/CURLOPT_PROXYAUTH.3 | 69 + docs/libcurl/opts/CURLOPT_PROXYHEADER.3 | 75 + docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 | 62 + docs/libcurl/opts/CURLOPT_PROXYPORT.3 | 57 + docs/libcurl/opts/CURLOPT_PROXYTYPE.3 | 76 + docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 | 66 + docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 | 62 + docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 | 83 + docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 | 71 + docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 | 75 + docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 | 62 + .../opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 | 111 + .../libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 | 57 + docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 | 72 + docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 | 67 + docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 | 68 + docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 | 61 + docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 | 100 + .../opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 | 81 + docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 | 75 + .../opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 | 89 + .../opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 | 89 + .../opts/CURLOPT_PROXY_TLS13_CIPHERS.3 | 69 + .../opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 | 62 + .../libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 | 70 + .../opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 | 62 + .../opts/CURLOPT_PROXY_TRANSFER_MODE.3 | 58 + docs/libcurl/opts/CURLOPT_PUT.3 | 46 + docs/libcurl/opts/CURLOPT_QUOTE.3 | 105 + docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 | 56 + docs/libcurl/opts/CURLOPT_RANGE.3 | 81 + docs/libcurl/opts/CURLOPT_READDATA.3 | 65 + docs/libcurl/opts/CURLOPT_READFUNCTION.3 | 111 + docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 | 104 + docs/libcurl/opts/CURLOPT_REFERER.3 | 60 + docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 | 56 + docs/libcurl/opts/CURLOPT_RESOLVE.3 | 97 + .../opts/CURLOPT_RESOLVER_START_DATA.3 | 63 + .../opts/CURLOPT_RESOLVER_START_FUNCTION.3 | 83 + docs/libcurl/opts/CURLOPT_RESUME_FROM.3 | 72 + docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 | 74 + docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 | 53 + docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 | 111 + docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 | 53 + docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 | 61 + docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 | 66 + docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 | 62 + docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 | 64 + docs/libcurl/opts/CURLOPT_SASL_IR.3 | 64 + docs/libcurl/opts/CURLOPT_SEEKDATA.3 | 57 + docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 | 89 + docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 | 58 + docs/libcurl/opts/CURLOPT_SHARE.3 | 81 + docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 | 67 + docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 | 124 + docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 | 63 + docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 | 56 + .../opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 | 60 + docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 | 59 + docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 | 58 + .../opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 | 60 + docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 | 63 + docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 | 124 + docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 | 61 + .../opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 | 64 + .../libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 | 65 + docs/libcurl/opts/CURLOPT_SSLCERT.3 | 78 + docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 | 62 + docs/libcurl/opts/CURLOPT_SSLENGINE.3 | 66 + docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 | 63 + docs/libcurl/opts/CURLOPT_SSLKEY.3 | 63 + docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 | 64 + docs/libcurl/opts/CURLOPT_SSLVERSION.3 | 113 + docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 | 77 + docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 | 124 + docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 | 83 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 | 53 + docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 | 53 + docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 | 55 + docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 | 73 + .../opts/CURLOPT_SSL_SESSIONID_CACHE.3 | 58 + docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 | 98 + docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 | 93 + docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 | 62 + docs/libcurl/opts/CURLOPT_STDERR.3 | 54 + docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 | 68 + docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 | 71 + docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 | 76 + .../opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 | 95 + docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 | 54 + docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 | 63 + docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 | 61 + docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 | 61 + docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 | 64 + docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 | 59 + docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 | 57 + docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 | 71 + docs/libcurl/opts/CURLOPT_TIMECONDITION.3 | 65 + docs/libcurl/opts/CURLOPT_TIMEOUT.3 | 72 + docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 | 74 + docs/libcurl/opts/CURLOPT_TIMEVALUE.3 | 62 + docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 | 64 + docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 | 68 + docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 | 62 + docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 | 67 + docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 | 62 + docs/libcurl/opts/CURLOPT_TRAILERDATA.3 | 49 + docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 | 101 + docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 | 59 + docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 | 61 + docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 | 81 + docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 | 60 + .../libcurl/opts/CURLOPT_UPKEEP_INTERVAL_MS.3 | 73 + docs/libcurl/opts/CURLOPT_UPLOAD.3 | 78 + docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3 | 69 + docs/libcurl/opts/CURLOPT_URL.3 | 356 + docs/libcurl/opts/CURLOPT_USERAGENT.3 | 59 + docs/libcurl/opts/CURLOPT_USERNAME.3 | 85 + docs/libcurl/opts/CURLOPT_USERPWD.3 | 91 + docs/libcurl/opts/CURLOPT_USE_SSL.3 | 70 + docs/libcurl/opts/CURLOPT_VERBOSE.3 | 64 + docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 | 87 + docs/libcurl/opts/CURLOPT_WRITEDATA.3 | 60 + docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 | 83 + docs/libcurl/opts/CURLOPT_XFERINFODATA.3 | 46 + docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 | 84 + docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 | 60 + docs/libcurl/opts/Makefile.am | 61 + docs/libcurl/opts/Makefile.inc | 354 + docs/libcurl/opts/template.3 | 38 + docs/libcurl/symbols-in-versions | 965 +++ docs/libcurl/symbols.pl | 100 + docs/mk-ca-bundle.1 | 119 + include/Makefile.am | 5 + include/README | 18 + include/curl/.gitignore | 3 + include/curl/Makefile.am | 39 + include/curl/curl.h | 2889 +++++++ include/curl/curlver.h | 77 + include/curl/easy.h | 112 + include/curl/mprintf.h | 50 + include/curl/multi.h | 456 + include/curl/stdcheaders.h | 33 + include/curl/system.h | 504 ++ include/curl/typecheck-gcc.h | 699 ++ include/curl/urlapi.h | 125 + lib/.gitattributes | 1 + lib/.gitignore | 12 + lib/CMakeLists.txt | 126 + lib/Makefile.Watcom | 274 + lib/Makefile.am | 154 + lib/Makefile.inc | 94 + lib/Makefile.m32 | 387 + lib/Makefile.netware | 731 ++ lib/Makefile.vxworks | 177 + lib/altsvc.c | 642 ++ lib/altsvc.h | 79 + lib/amigaos.c | 95 + lib/amigaos.h | 44 + lib/arpa_telnet.h | 108 + lib/asyn-ares.c | 813 ++ lib/asyn-thread.c | 802 ++ lib/asyn.h | 183 + lib/base64.c | 326 + lib/checksrc.pl | 761 ++ lib/config-amigaos.h | 164 + lib/config-dos.h | 182 + lib/config-mac.h | 125 + lib/config-os400.h | 575 ++ lib/config-plan9.h | 214 + lib/config-riscos.h | 507 ++ lib/config-symbian.h | 796 ++ lib/config-tpf.h | 760 ++ lib/config-vxworks.h | 907 ++ lib/config-win32.h | 760 ++ lib/config-win32ce.h | 448 + lib/conncache.c | 603 ++ lib/conncache.h | 108 + lib/connect.c | 1589 ++++ lib/connect.h | 147 + lib/content_encoding.c | 1020 +++ lib/content_encoding.h | 55 + lib/cookie.c | 1677 ++++ lib/cookie.h | 120 + lib/curl_addrinfo.c | 624 ++ lib/curl_addrinfo.h | 107 + lib/curl_base64.h | 35 + lib/curl_config.h.cmake | 1023 +++ lib/curl_ctype.c | 133 + lib/curl_ctype.h | 81 + lib/curl_des.c | 63 + lib/curl_des.h | 34 + lib/curl_endian.c | 124 + lib/curl_endian.h | 43 + lib/curl_fnmatch.c | 389 + lib/curl_fnmatch.h | 44 + lib/curl_get_line.c | 55 + lib/curl_get_line.h | 29 + lib/curl_gethostname.c | 100 + lib/curl_gethostname.h | 31 + lib/curl_gssapi.c | 136 + lib/curl_gssapi.h | 61 + lib/curl_hmac.h | 74 + lib/curl_ldap.h | 34 + lib/curl_md4.h | 36 + lib/curl_md5.h | 63 + lib/curl_memory.h | 156 + lib/curl_memrchr.c | 62 + lib/curl_memrchr.h | 44 + lib/curl_multibyte.c | 84 + lib/curl_multibyte.h | 97 + lib/curl_ntlm_core.c | 746 ++ lib/curl_ntlm_core.h | 105 + lib/curl_ntlm_wb.c | 503 ++ lib/curl_ntlm_wb.h | 41 + lib/curl_path.c | 199 + lib/curl_path.h | 47 + lib/curl_printf.h | 48 + lib/curl_range.c | 95 + lib/curl_range.h | 30 + lib/curl_rtmp.c | 316 + lib/curl_rtmp.h | 33 + lib/curl_sasl.c | 633 ++ lib/curl_sasl.h | 143 + lib/curl_sec.h | 51 + lib/curl_setup.h | 838 ++ lib/curl_setup_once.h | 497 ++ lib/curl_sha256.h | 35 + lib/curl_sspi.c | 236 + lib/curl_sspi.h | 350 + lib/curl_threads.c | 155 + lib/curl_threads.h | 64 + lib/curlx.h | 103 + lib/dict.c | 276 + lib/dict.h | 29 + lib/doh.c | 1025 +++ lib/doh.h | 114 + lib/dotdot.c | 182 + lib/dotdot.h | 25 + lib/easy.c | 1216 +++ lib/easyif.h | 32 + lib/escape.c | 244 + lib/escape.h | 33 + lib/file.c | 546 ++ lib/file.h | 40 + lib/fileinfo.c | 44 + lib/fileinfo.h | 36 + lib/firefox-db2pem.sh | 53 + lib/formdata.c | 946 +++ lib/formdata.h | 60 + lib/ftp.c | 4367 ++++++++++ lib/ftp.h | 158 + lib/ftplistparser.c | 1019 +++ lib/ftplistparser.h | 41 + lib/getenv.c | 77 + lib/getinfo.c | 494 ++ lib/getinfo.h | 27 + lib/gopher.c | 174 + lib/gopher.h | 29 + lib/hash.c | 351 + lib/hash.h | 100 + lib/hmac.c | 169 + lib/hostasyn.c | 128 + lib/hostcheck.c | 150 + lib/hostcheck.h | 31 + lib/hostip.c | 1094 +++ lib/hostip.h | 249 + lib/hostip4.c | 298 + lib/hostip6.c | 210 + lib/hostsyn.c | 107 + lib/http.c | 4167 ++++++++++ lib/http.h | 276 + lib/http2.c | 2449 ++++++ lib/http2.h | 82 + lib/http_chunks.c | 359 + lib/http_chunks.h | 99 + lib/http_digest.c | 181 + lib/http_digest.h | 42 + lib/http_negotiate.c | 220 + lib/http_negotiate.h | 38 + lib/http_ntlm.c | 252 + lib/http_ntlm.h | 40 + lib/http_proxy.c | 690 ++ lib/http_proxy.h | 51 + lib/idn_win32.c | 111 + lib/if2ip.c | 243 + lib/if2ip.h | 82 + lib/imap.c | 2102 +++++ lib/imap.h | 98 + lib/inet_ntop.c | 197 + lib/inet_ntop.h | 37 + lib/inet_pton.c | 237 + lib/inet_pton.h | 39 + lib/krb5.c | 341 + lib/ldap.c | 1096 +++ lib/libcurl.plist | 35 + lib/libcurl.rc | 63 + lib/libcurl.vers.in | 13 + lib/llist.c | 146 + lib/llist.h | 50 + lib/makefile.amiga | 21 + lib/makefile.dj | 71 + lib/md4.c | 520 ++ lib/md5.c | 619 ++ lib/memdebug.c | 503 ++ lib/memdebug.h | 174 + lib/mime.c | 2042 +++++ lib/mime.h | 168 + lib/mk-ca-bundle.pl | 604 ++ lib/mk-ca-bundle.vbs | 431 + lib/mprintf.c | 1173 +++ lib/multi.c | 3366 ++++++++ lib/multihandle.h | 152 + lib/multiif.h | 96 + lib/netrc.c | 278 + lib/netrc.h | 45 + lib/non-ascii.c | 332 + lib/non-ascii.h | 61 + lib/nonblock.c | 91 + lib/nonblock.h | 30 + lib/nwlib.c | 328 + lib/nwos.c | 88 + lib/openldap.c | 758 ++ lib/parsedate.c | 635 ++ lib/parsedate.h | 36 + lib/pingpong.c | 517 ++ lib/pingpong.h | 150 + lib/pop3.c | 1544 ++++ lib/pop3.h | 95 + lib/progress.c | 625 ++ lib/progress.h | 64 + lib/psl.c | 111 + lib/psl.h | 47 + lib/quic.h | 57 + lib/rand.c | 186 + lib/rand.h | 49 + lib/rename.c | 62 + lib/rename.h | 27 + lib/rtsp.c | 822 ++ lib/rtsp.h | 66 + lib/security.c | 579 ++ lib/select.c | 498 ++ lib/select.h | 107 + lib/sendf.c | 828 ++ lib/sendf.h | 91 + lib/setopt.c | 2795 +++++++ lib/setopt.h | 28 + lib/setup-os400.h | 227 + lib/setup-vms.h | 443 + lib/sha256.c | 492 ++ lib/share.c | 257 + lib/share.h | 66 + lib/sigpipe.h | 79 + lib/slist.c | 144 + lib/slist.h | 39 + lib/smb.c | 1001 +++ lib/smb.h | 259 + lib/smtp.c | 1889 +++++ lib/smtp.h | 96 + lib/sockaddr.h | 42 + lib/socketpair.c | 121 + lib/socketpair.h | 36 + lib/socks.c | 979 +++ lib/socks.h | 80 + lib/socks_gssapi.c | 531 ++ lib/socks_sspi.c | 609 ++ lib/speedcheck.c | 73 + lib/speedcheck.h | 33 + lib/splay.c | 276 + lib/splay.h | 62 + lib/strcase.c | 263 + lib/strcase.h | 51 + lib/strdup.c | 100 + lib/strdup.h | 32 + lib/strerror.c | 1009 +++ lib/strerror.h | 37 + lib/strtok.c | 66 + lib/strtok.h | 34 + lib/strtoofft.c | 242 + lib/strtoofft.h | 52 + lib/system_win32.c | 433 + lib/system_win32.h | 68 + lib/telnet.c | 1699 ++++ lib/telnet.h | 28 + lib/tftp.c | 1423 ++++ lib/tftp.h | 28 + lib/timeval.c | 206 + lib/timeval.h | 58 + lib/transfer.c | 1893 +++++ lib/transfer.h | 72 + lib/url.c | 4074 +++++++++ lib/url.h | 92 + lib/urlapi-int.h | 34 + lib/urlapi.c | 1489 ++++ lib/urldata.h | 1927 +++++ lib/vauth/cleartext.c | 169 + lib/vauth/cram.c | 138 + lib/vauth/digest.c | 997 +++ lib/vauth/digest.h | 47 + lib/vauth/digest_sspi.c | 680 ++ lib/vauth/krb5_gssapi.c | 401 + lib/vauth/krb5_sspi.c | 532 ++ lib/vauth/ntlm.c | 872 ++ lib/vauth/ntlm.h | 143 + lib/vauth/ntlm_sspi.c | 381 + lib/vauth/oauth2.c | 126 + lib/vauth/spnego_gssapi.c | 282 + lib/vauth/spnego_sspi.c | 369 + lib/vauth/vauth.c | 147 + lib/vauth/vauth.h | 215 + lib/version.c | 484 ++ lib/vquic/ngtcp2.c | 1769 ++++ lib/vquic/ngtcp2.h | 63 + lib/vquic/quiche.c | 807 ++ lib/vquic/quiche.h | 49 + lib/vssh/libssh.c | 2850 +++++++ lib/vssh/libssh2.c | 3518 ++++++++ lib/vssh/ssh.h | 262 + lib/vssh/wolfssh.c | 1156 +++ lib/vssh/wolfssh.h | 27 + lib/vtls/bearssl.c | 866 ++ lib/vtls/bearssl.h | 32 + lib/vtls/gskit.c | 1289 +++ lib/vtls/gskit.h | 38 + lib/vtls/gtls.c | 1885 +++++ lib/vtls/gtls.h | 34 + lib/vtls/mbedtls.c | 1089 +++ lib/vtls/mbedtls.h | 32 + lib/vtls/mbedtls_threadlock.c | 144 + lib/vtls/mbedtls_threadlock.h | 48 + lib/vtls/mesalink.c | 664 ++ lib/vtls/mesalink.h | 32 + lib/vtls/nss.c | 2448 ++++++ lib/vtls/nssg.h | 39 + lib/vtls/openssl.c | 4144 ++++++++++ lib/vtls/openssl.h | 37 + lib/vtls/schannel.c | 2294 ++++++ lib/vtls/schannel.h | 108 + lib/vtls/schannel_verify.c | 687 ++ lib/vtls/sectransp.c | 3277 ++++++++ lib/vtls/sectransp.h | 32 + lib/vtls/vtls.c | 1351 +++ lib/vtls/vtls.h | 276 + lib/vtls/wolfssl.c | 991 +++ lib/vtls/wolfssl.h | 31 + lib/warnless.c | 508 ++ lib/warnless.h | 112 + lib/wildcard.c | 73 + lib/wildcard.h | 67 + lib/x509asn1.c | 1283 +++ lib/x509asn1.h | 134 + libcurl.pc.in | 39 + m4/.gitignore | 6 + m4/ax_compile_check_sizeof.m4 | 115 + m4/curl-compilers.m4 | 1644 ++++ m4/curl-confopts.m4 | 686 ++ m4/curl-functions.m4 | 7338 +++++++++++++++++ m4/curl-openssl.m4 | 278 + m4/curl-override.m4 | 75 + m4/curl-reentrant.m4 | 616 ++ m4/xc-am-iface.m4 | 252 + m4/xc-cc-check.m4 | 95 + m4/xc-lt-iface.m4 | 464 ++ m4/xc-translit.m4 | 163 + m4/xc-val-flgs.m4 | 242 + m4/zz40-xc-ovr.m4 | 665 ++ m4/zz50-xc-ovr.m4 | 59 + m4/zz60-xc-ovr.m4 | 63 + maketgz | 217 + packages/Android/Android.mk | 110 + packages/DOS/README | 11 + packages/DOS/common.dj | 136 + packages/Makefile.am | 31 + packages/OS400/README.OS400 | 341 + packages/OS400/ccsidcurl.c | 1472 ++++ packages/OS400/ccsidcurl.h | 93 + packages/OS400/chkstrings.c | 62 + packages/OS400/curl.inc.in | 2844 +++++++ packages/OS400/initscript.sh | 261 + packages/OS400/make-include.sh | 83 + packages/OS400/make-lib.sh | 224 + packages/OS400/make-src.sh | 4 + packages/OS400/make-tests.sh | 114 + packages/OS400/makefile.sh | 54 + packages/OS400/os400sys.c | 1492 ++++ packages/OS400/os400sys.h | 55 + packages/README | 27 + packages/Symbian/bwins/libcurlu.def | 60 + packages/Symbian/eabi/libcurlu.def | 60 + packages/Symbian/group/bld.inf | 10 + packages/Symbian/group/curl.iby | 15 + packages/Symbian/group/curl.mmp | 63 + packages/Symbian/group/curl.pkg | 26 + packages/Symbian/group/libcurl.iby | 14 + packages/Symbian/group/libcurl.mmp | 67 + packages/Symbian/group/libcurl.pkg | 22 + packages/Symbian/readme.txt | 93 + packages/TPF/curl.mak | 59 + packages/TPF/maketpf.env_curl | 24 + packages/TPF/maketpf.env_curllib | 56 + packages/vms/Makefile.am | 36 + packages/vms/backup_gnv_curl_src.com | 132 + packages/vms/build_curl-config_script.com | 154 + packages/vms/build_gnv_curl.com | 38 + packages/vms/build_gnv_curl_pcsi_desc.com | 492 ++ packages/vms/build_gnv_curl_pcsi_text.com | 198 + packages/vms/build_gnv_curl_release_notes.com | 102 + packages/vms/build_libcurl_pc.com | 205 + packages/vms/build_vms.com | 1038 +++ packages/vms/clean_gnv_curl.com | 241 + packages/vms/compare_curl_source.com | 371 + packages/vms/config_h.com | 2149 +++++ packages/vms/curl_crtl_init.c | 310 + packages/vms/curl_gnv_build_steps.txt | 288 + packages/vms/curl_release_note_start.txt | 77 + packages/vms/curl_startup.com | 100 + packages/vms/curlmsg.h | 141 + packages/vms/curlmsg.msg | 111 + packages/vms/curlmsg.sdl | 116 + packages/vms/curlmsg_vms.h | 141 + packages/vms/generate_config_vms_h_curl.com | 466 ++ packages/vms/generate_vax_transfer.com | 274 + packages/vms/gnv_conftest.c_first | 60 + packages/vms/gnv_curl_configure.sh | 46 + packages/vms/gnv_libcurl_symbols.opt | 181 + packages/vms/gnv_link_curl.com | 852 ++ packages/vms/macro32_exactcase.patch | 11 + packages/vms/make_gnv_curl_install.sh | 45 + packages/vms/make_pcsi_curl_kit_name.com | 190 + packages/vms/pcsi_gnv_curl_file_list.txt | 126 + packages/vms/pcsi_product_gnv_curl.com | 199 + packages/vms/readme | 228 + packages/vms/report_openssl_version.c | 100 + packages/vms/setup_gnv_curl_build.com | 288 + packages/vms/stage_curl_install.com | 173 + packages/vms/vms_eco_level.h | 30 + plan9/BUILD.PLAN9.txt | 55 + plan9/include/mkfile | 34 + plan9/lib/mkfile | 39 + plan9/lib/mkfile.inc | 25 + plan9/mkfile | 36 + plan9/mkfile.proto | 30 + plan9/src/mkfile | 45 + plan9/src/mkfile.inc | 25 + projects/README | 159 + projects/Windows/.gitattributes | 1 + projects/Windows/.gitignore | 6 + projects/Windows/VC10/.gitignore | 4 + projects/Windows/VC10/curl-all.sln | 298 + projects/Windows/VC10/lib/.gitignore | 6 + projects/Windows/VC10/lib/libcurl.sln | 181 + projects/Windows/VC10/lib/libcurl.tmpl | 2345 ++++++ .../Windows/VC10/lib/libcurl.vcxproj.filters | 17 + projects/Windows/VC10/src/.gitignore | 6 + projects/Windows/VC10/src/curl.sln | 181 + projects/Windows/VC10/src/curl.tmpl | 2643 ++++++ .../Windows/VC10/src/curl.vcxproj.filters | 17 + projects/Windows/VC11/.gitignore | 4 + projects/Windows/VC11/curl-all.sln | 298 + projects/Windows/VC11/lib/.gitignore | 6 + projects/Windows/VC11/lib/libcurl.sln | 181 + projects/Windows/VC11/lib/libcurl.tmpl | 2401 ++++++ .../Windows/VC11/lib/libcurl.vcxproj.filters | 17 + projects/Windows/VC11/src/.gitignore | 6 + projects/Windows/VC11/src/curl.sln | 181 + projects/Windows/VC11/src/curl.tmpl | 2699 ++++++ .../Windows/VC11/src/curl.vcxproj.filters | 17 + projects/Windows/VC12/.gitignore | 4 + projects/Windows/VC12/curl-all.sln | 298 + projects/Windows/VC12/lib/.gitignore | 6 + projects/Windows/VC12/lib/libcurl.sln | 181 + projects/Windows/VC12/lib/libcurl.tmpl | 2401 ++++++ .../Windows/VC12/lib/libcurl.vcxproj.filters | 17 + projects/Windows/VC12/src/.gitignore | 6 + projects/Windows/VC12/src/curl.sln | 181 + projects/Windows/VC12/src/curl.tmpl | 2699 ++++++ .../Windows/VC12/src/curl.vcxproj.filters | 17 + projects/Windows/VC14/.gitignore | 5 + projects/Windows/VC14/curl-all.sln | 298 + projects/Windows/VC14/lib/.gitignore | 6 + projects/Windows/VC14/lib/libcurl.sln | 181 + projects/Windows/VC14/lib/libcurl.tmpl | 2401 ++++++ .../Windows/VC14/lib/libcurl.vcxproj.filters | 17 + projects/Windows/VC14/src/.gitignore | 6 + projects/Windows/VC14/src/curl.sln | 181 + projects/Windows/VC14/src/curl.tmpl | 2699 ++++++ .../Windows/VC14/src/curl.vcxproj.filters | 17 + projects/Windows/VC15/.gitignore | 5 + projects/Windows/VC15/curl-all.sln | 298 + projects/Windows/VC15/lib/.gitignore | 6 + projects/Windows/VC15/lib/libcurl.sln | 181 + projects/Windows/VC15/lib/libcurl.tmpl | 2373 ++++++ .../Windows/VC15/lib/libcurl.vcxproj.filters | 17 + projects/Windows/VC15/src/.gitignore | 6 + projects/Windows/VC15/src/curl.sln | 181 + projects/Windows/VC15/src/curl.tmpl | 2671 ++++++ .../Windows/VC15/src/curl.vcxproj.filters | 17 + projects/Windows/VC6/.gitignore | 2 + projects/Windows/VC6/curl-all.dsw | 44 + projects/Windows/VC6/lib/.gitignore | 5 + projects/Windows/VC6/lib/libcurl.dsw | 29 + projects/Windows/VC6/lib/libcurl.tmpl | 752 ++ projects/Windows/VC6/src/.gitignore | 5 + projects/Windows/VC6/src/curl.dsw | 29 + projects/Windows/VC6/src/curl.tmpl | 695 ++ projects/Windows/VC7.1/.gitignore | 2 + projects/Windows/VC7.1/curl-all.sln | 140 + projects/Windows/VC7.1/lib/.gitignore | 3 + projects/Windows/VC7.1/lib/libcurl.sln | 87 + projects/Windows/VC7.1/lib/libcurl.tmpl | 1329 +++ projects/Windows/VC7.1/src/.gitignore | 3 + projects/Windows/VC7.1/src/curl.sln | 87 + projects/Windows/VC7.1/src/curl.tmpl | 1381 ++++ projects/Windows/VC7/.gitignore | 1 + projects/Windows/VC7/curl-all.sln | 138 + projects/Windows/VC7/lib/.gitignore | 2 + projects/Windows/VC7/lib/libcurl.sln | 87 + projects/Windows/VC7/lib/libcurl.tmpl | 1183 +++ projects/Windows/VC7/src/.gitignore | 2 + projects/Windows/VC7/src/curl.sln | 87 + projects/Windows/VC7/src/curl.tmpl | 1235 +++ projects/Windows/VC8/.gitignore | 2 + projects/Windows/VC8/curl-all.sln | 258 + projects/Windows/VC8/lib/.gitignore | 4 + projects/Windows/VC8/lib/libcurl.sln | 157 + projects/Windows/VC8/lib/libcurl.tmpl | 3690 +++++++++ projects/Windows/VC8/src/.gitignore | 4 + projects/Windows/VC8/src/curl.sln | 157 + projects/Windows/VC8/src/curl.tmpl | 4100 +++++++++ projects/Windows/VC9/.gitignore | 2 + projects/Windows/VC9/curl-all.sln | 258 + projects/Windows/VC9/lib/.gitignore | 4 + projects/Windows/VC9/lib/libcurl.sln | 157 + projects/Windows/VC9/lib/libcurl.tmpl | 3631 ++++++++ projects/Windows/VC9/src/.gitignore | 4 + projects/Windows/VC9/src/curl.sln | 157 + projects/Windows/VC9/src/curl.tmpl | 3957 +++++++++ projects/build-openssl.bat | 695 ++ projects/build-wolfssl.bat | 374 + projects/checksrc.bat | 223 + projects/generate.bat | 472 ++ projects/wolfssl_options.h | 223 + projects/wolfssl_override.props | 40 + scripts/Makefile.am | 57 + scripts/completion.pl | 134 + scripts/contributors.sh | 98 + scripts/contrithanks.sh | 76 + scripts/coverage.sh | 16 + scripts/delta | 141 + scripts/installcheck.sh | 27 + scripts/log2changes.pl | 81 + scripts/singleuse.pl | 215 + scripts/travis/before_script.sh | 107 + scripts/travis/iconv-env.sh | 1 + scripts/travis/script.sh | 155 + scripts/updatemanpages.pl | 355 + src/.gitignore | 10 + src/CMakeLists.txt | 82 + src/Makefile.Watcom | 234 + src/Makefile.am | 155 + src/Makefile.inc | 115 + src/Makefile.m32 | 402 + src/Makefile.netware | 502 ++ src/curl.rc | 111 + src/macos/MACINSTALL.TXT | 1 + src/macos/curl.mcp.xml.sit.hqx | 1 + src/macos/src/curl_GUSIConfig.cpp | 1 + src/macos/src/macos_main.cpp | 1 + src/makefile.amiga | 29 + src/makefile.dj | 93 + src/mkhelp.pl | 235 + src/slist_wc.c | 72 + src/slist_wc.h | 55 + src/tool_binmode.c | 51 + src/tool_binmode.h | 36 + src/tool_bname.c | 49 + src/tool_bname.h | 34 + src/tool_cb_dbg.c | 281 + src/tool_cb_dbg.h | 34 + src/tool_cb_hdr.c | 343 + src/tool_cb_hdr.h | 56 + src/tool_cb_prg.c | 273 + src/tool_cb_prg.h | 52 + src/tool_cb_rea.c | 79 + src/tool_cb_rea.h | 40 + src/tool_cb_see.c | 132 + src/tool_cb_see.h | 44 + src/tool_cb_wrt.c | 221 + src/tool_cb_wrt.h | 36 + src/tool_cfgable.c | 182 + src/tool_cfgable.h | 315 + src/tool_convert.c | 147 + src/tool_convert.h | 44 + src/tool_dirhie.c | 170 + src/tool_dirhie.h | 28 + src/tool_doswin.c | 728 ++ src/tool_doswin.h | 70 + src/tool_easysrc.c | 236 + src/tool_easysrc.h | 49 + src/tool_filetime.c | 154 + src/tool_filetime.h | 37 + src/tool_formparse.c | 917 ++ src/tool_formparse.h | 72 + src/tool_getparam.c | 2307 ++++++ src/tool_getparam.h | 65 + src/tool_getpass.c | 258 + src/tool_getpass.h | 36 + src/tool_help.c | 645 ++ src/tool_help.h | 30 + src/tool_helpers.c | 122 + src/tool_helpers.h | 34 + src/tool_homedir.c | 88 + src/tool_homedir.h | 28 + src/tool_hugehelp.c.cvs | 29 + src/tool_hugehelp.h | 28 + src/tool_libinfo.c | 101 + src/tool_libinfo.h | 33 + src/tool_main.c | 343 + src/tool_main.h | 46 + src/tool_metalink.c | 944 +++ src/tool_metalink.h | 171 + src/tool_msgs.c | 139 + src/tool_msgs.h | 31 + src/tool_operate.c | 2510 ++++++ src/tool_operate.h | 76 + src/tool_operhlp.c | 197 + src/tool_operhlp.h | 38 + src/tool_panykey.c | 47 + src/tool_panykey.h | 36 + src/tool_paramhlp.c | 648 ++ src/tool_paramhlp.h | 57 + src/tool_parsecfg.c | 372 + src/tool_parsecfg.h | 28 + src/tool_progress.c | 321 + src/tool_progress.h | 39 + src/tool_sdecls.h | 149 + src/tool_setopt.c | 843 ++ src/tool_setopt.h | 160 + src/tool_setup.h | 73 + src/tool_sleep.c | 57 + src/tool_sleep.h | 28 + src/tool_strdup.c | 47 + src/tool_strdup.h | 30 + src/tool_urlglob.c | 714 ++ src/tool_urlglob.h | 76 + src/tool_util.c | 135 + src/tool_util.h | 36 + src/tool_version.h | 34 + src/tool_vms.c | 218 + src/tool_vms.h | 46 + src/tool_writeout.c | 382 + src/tool_writeout.h | 28 + src/tool_xattr.c | 139 + src/tool_xattr.h | 28 + tests/.gitignore | 20 + tests/CMakeLists.txt | 4 + tests/FILEFORMAT | 479 ++ tests/Makefile.am | 126 + tests/README | 274 + tests/appveyor.pm | 114 + tests/azure.pm | 146 + tests/badsymbols.pl | 132 + tests/certs/EdelCurlRoot-ca.cacert | 84 + tests/certs/EdelCurlRoot-ca.cnf | 11 + tests/certs/EdelCurlRoot-ca.crt | 84 + tests/certs/EdelCurlRoot-ca.csr | 17 + tests/certs/EdelCurlRoot-ca.der | Bin 0 -> 918 bytes tests/certs/EdelCurlRoot-ca.key | 27 + tests/certs/EdelCurlRoot-ca.prm | 17 + tests/certs/Makefile.am | 116 + tests/certs/Server-localhost-firstSAN-sv.crl | 15 + tests/certs/Server-localhost-firstSAN-sv.crt | 92 + tests/certs/Server-localhost-firstSAN-sv.csr | 16 + tests/certs/Server-localhost-firstSAN-sv.der | Bin 0 -> 994 bytes tests/certs/Server-localhost-firstSAN-sv.dhp | 0 tests/certs/Server-localhost-firstSAN-sv.key | 27 + tests/certs/Server-localhost-firstSAN-sv.pem | 144 + tests/certs/Server-localhost-firstSAN-sv.prm | 25 + .../Server-localhost-firstSAN-sv.pub.der | Bin 0 -> 294 bytes .../Server-localhost-firstSAN-sv.pub.pem | 9 + tests/certs/Server-localhost-lastSAN-sv.crl | 12 + tests/certs/Server-localhost-lastSAN-sv.crt | 93 + tests/certs/Server-localhost-lastSAN-sv.csr | 16 + tests/certs/Server-localhost-lastSAN-sv.der | Bin 0 -> 994 bytes tests/certs/Server-localhost-lastSAN-sv.dhp | 0 tests/certs/Server-localhost-lastSAN-sv.key | 27 + tests/certs/Server-localhost-lastSAN-sv.pem | 145 + tests/certs/Server-localhost-lastSAN-sv.prm | 25 + .../certs/Server-localhost-lastSAN-sv.pub.der | Bin 0 -> 294 bytes .../certs/Server-localhost-lastSAN-sv.pub.pem | 9 + tests/certs/Server-localhost-sv.crl | 12 + tests/certs/Server-localhost-sv.crt | 92 + tests/certs/Server-localhost-sv.csr | 16 + tests/certs/Server-localhost-sv.der | Bin 0 -> 967 bytes tests/certs/Server-localhost-sv.dhp | 0 tests/certs/Server-localhost-sv.key | 27 + tests/certs/Server-localhost-sv.pem | 144 + tests/certs/Server-localhost-sv.prm | 25 + tests/certs/Server-localhost-sv.pub.der | Bin 0 -> 294 bytes tests/certs/Server-localhost-sv.pub.pem | 9 + tests/certs/Server-localhost.nn-sv.crl | 13 + tests/certs/Server-localhost.nn-sv.crt | 92 + tests/certs/Server-localhost.nn-sv.csr | 16 + tests/certs/Server-localhost.nn-sv.der | Bin 0 -> 973 bytes tests/certs/Server-localhost.nn-sv.dhp | 0 tests/certs/Server-localhost.nn-sv.key | 27 + tests/certs/Server-localhost.nn-sv.pem | 144 + tests/certs/Server-localhost.nn-sv.prm | 25 + tests/certs/Server-localhost.nn-sv.pub.der | Bin 0 -> 294 bytes tests/certs/Server-localhost.nn-sv.pub.pem | 9 + tests/certs/Server-localhost0h-sv.crl | 14 + tests/certs/Server-localhost0h-sv.crt | 92 + tests/certs/Server-localhost0h-sv.csr | 16 + tests/certs/Server-localhost0h-sv.der | Bin 0 -> 969 bytes tests/certs/Server-localhost0h-sv.dhp | 0 tests/certs/Server-localhost0h-sv.key | 27 + tests/certs/Server-localhost0h-sv.pem | 145 + tests/certs/Server-localhost0h-sv.prm | 26 + tests/certs/Server-localhost0h-sv.pub.der | Bin 0 -> 294 bytes tests/certs/Server-localhost0h-sv.pub.pem | 9 + tests/certs/scripts/Makefile.am | 28 + tests/certs/scripts/genroot.sh | 68 + tests/certs/scripts/genserv.sh | 118 + tests/certs/srp-verifier-conf | 3 + tests/certs/srp-verifier-db | 2 + tests/convsrctest.pl | 255 + tests/curl_test_data.py | 61 + tests/data/.gitattributes | 1 + tests/data/.gitignore | 1 + tests/data/CMakeLists.txt | 7 + tests/data/DISABLED | 30 + tests/data/Makefile.am | 29 + tests/data/Makefile.inc | 216 + tests/data/test1 | 55 + tests/data/test10 | 67 + tests/data/test100 | 57 + tests/data/test1000 | 42 + tests/data/test1001 | 108 + tests/data/test1002 | 126 + tests/data/test1003 | 48 + tests/data/test1004 | 59 + tests/data/test1005 | 48 + tests/data/test1006 | 49 + tests/data/test1007 | 42 + tests/data/test1008 | 135 + tests/data/test1009 | 47 + tests/data/test101 | 58 + tests/data/test1010 | 58 + tests/data/test1011 | 76 + tests/data/test1012 | 79 + tests/data/test1013 | 37 + tests/data/test1014 | 37 + tests/data/test1015 | 55 + tests/data/test1016 | 39 + tests/data/test1017 | 40 + tests/data/test1018 | 39 + tests/data/test1019 | 42 + tests/data/test102 | 52 + tests/data/test1020 | 41 + tests/data/test1021 | 143 + tests/data/test1022 | 37 + tests/data/test1023 | 37 + tests/data/test1024 | 103 + tests/data/test1025 | 105 + tests/data/test1026 | 42 + tests/data/test1027 | 39 + tests/data/test1028 | 94 + tests/data/test1029 | 58 + tests/data/test103 | 54 + tests/data/test1030 | 110 + tests/data/test1031 | 76 + tests/data/test1032 | 56 + tests/data/test1033 | 60 + tests/data/test1034 | 56 + tests/data/test1035 | 52 + tests/data/test1036 | 61 + tests/data/test1037 | 54 + tests/data/test1038 | 53 + tests/data/test1039 | 53 + tests/data/test104 | 43 + tests/data/test1040 | 79 + tests/data/test1041 | 78 + tests/data/test1042 | 94 + tests/data/test1043 | 84 + tests/data/test1044 | 58 + tests/data/test1045 | 52 + tests/data/test1046 | 60 + tests/data/test1047 | 58 + tests/data/test1048 | 68 + tests/data/test1049 | 47 + tests/data/test105 | 53 + tests/data/test1050 | 66 + tests/data/test1051 | 118 + tests/data/test1052 | 111 + tests/data/test1053 | 127 + tests/data/test1054 | 80 + tests/data/test1055 | 100 + tests/data/test1056 | 81 + tests/data/test1057 | 52 + tests/data/test1058 | 53 + tests/data/test1059 | 59 + tests/data/test106 | 52 + tests/data/test1060 | 903 ++ tests/data/test1061 | 908 ++ tests/data/test1062 | 49 + tests/data/test1063 | 45 + tests/data/test1064 | 79 + tests/data/test1065 | 78 + tests/data/test1066 | 82 + tests/data/test1067 | 78 + tests/data/test1068 | 58 + tests/data/test1069 | 36 + tests/data/test107 | 51 + tests/data/test1070 | 65 + tests/data/test1071 | 114 + tests/data/test1072 | 78 + tests/data/test1073 | 72 + tests/data/test1074 | 76 + tests/data/test1075 | 94 + tests/data/test1076 | 79 + tests/data/test1077 | 76 + tests/data/test1078 | 99 + tests/data/test1079 | 76 + tests/data/test108 | 56 + tests/data/test1080 | 69 + tests/data/test1081 | 77 + tests/data/test1082 | 55 + tests/data/test1083 | 59 + tests/data/test1084 | 41 + tests/data/test1085 | 48 + tests/data/test1086 | 110 + tests/data/test1087 | 113 + tests/data/test1088 | 115 + tests/data/test1089 | 91 + tests/data/test109 | 48 + tests/data/test1090 | 98 + tests/data/test1091 | 47 + tests/data/test1092 | 57 + tests/data/test1093 | 47 + tests/data/test1094 | 53 + tests/data/test1095 | 84 + tests/data/test1096 | 50 + tests/data/test1097 | 82 + tests/data/test1098 | 74 + tests/data/test1099 | 51 + tests/data/test11 | 76 + tests/data/test110 | 52 + tests/data/test1100 | 119 + tests/data/test1101 | 54 + tests/data/test1102 | 51 + tests/data/test1103 | 48 + tests/data/test1104 | 88 + tests/data/test1105 | 65 + tests/data/test1106 | 58 + tests/data/test1107 | 53 + tests/data/test1108 | 45 + tests/data/test1109 | 46 + tests/data/test111 | 45 + tests/data/test1110 | 47 + tests/data/test1111 | 47 + tests/data/test1112 | 114 + tests/data/test1113 | 99 + tests/data/test1114 | 136 + tests/data/test1115 | 52 + tests/data/test1116 | 79 + tests/data/test1117 | 87 + tests/data/test1118 | 55 + tests/data/test1119 | 25 + tests/data/test112 | 49 + tests/data/test1120 | 44 + tests/data/test1121 | 47 + tests/data/test1122 | 70 + tests/data/test1123 | 201 + tests/data/test1124 | 69 + tests/data/test1125 | 70 + tests/data/test1126 | 52 + tests/data/test1127 | 61 + tests/data/test1128 | 85 + tests/data/test1129 | 97 + tests/data/test113 | 37 + tests/data/test1130 | 97 + tests/data/test1131 | 95 + tests/data/test1132 | 25 + tests/data/test1133 | 102 + tests/data/test1134 | 65 + tests/data/test1135 | 111 + tests/data/test1136 | 65 + tests/data/test1137 | 52 + tests/data/test1138 | 74 + tests/data/test1139 | 27 + tests/data/test114 | 38 + tests/data/test1140 | 26 + tests/data/test1141 | 73 + tests/data/test1142 | 67 + tests/data/test1143 | 50 + tests/data/test1144 | 70 + tests/data/test1145 | 40 + tests/data/test1146 | 45 + tests/data/test1147 | 64 + tests/data/test1148 | 69 + tests/data/test1149 | 64 + tests/data/test115 | 44 + tests/data/test1150 | 58 + tests/data/test1151 | 66 + tests/data/test1152 | 61 + tests/data/test1153 | 61 + tests/data/test1154 | 57 + tests/data/test1155 | 54 + tests/data/test1156 | 71 + tests/data/test1157 | 58 + tests/data/test1158 | 98 + tests/data/test1159 | 58 + tests/data/test116 | 55 + tests/data/test1160 | 54 + tests/data/test1161 | 54 + tests/data/test1162 | 56 + tests/data/test1163 | 52 + tests/data/test1164 | 52 + tests/data/test1165 | 25 + tests/data/test1166 | 53 + tests/data/test1167 | 24 + tests/data/test117 | 44 + tests/data/test1170 | 70 + tests/data/test1171 | 70 + tests/data/test1172 | 50 + tests/data/test1173 | 26 + tests/data/test1174 | 50 + tests/data/test1175 | 25 + tests/data/test1176 | 68 + tests/data/test118 | 48 + tests/data/test119 | 50 + tests/data/test12 | 56 + tests/data/test120 | 53 + tests/data/test1200 | 39 + tests/data/test1201 | 39 + tests/data/test1202 | 40 + tests/data/test1203 | 43 + tests/data/test1204 | 79 + tests/data/test1205 | 50 + tests/data/test1206 | 53 + tests/data/test1207 | 53 + tests/data/test1208 | 58 + tests/data/test1209 | 58 + tests/data/test121 | 51 + tests/data/test1210 | 63 + tests/data/test1211 | 53 + tests/data/test1212 | 51 + tests/data/test1213 | 56 + tests/data/test1214 | 56 + tests/data/test1215 | 108 + tests/data/test1216 | 66 + tests/data/test1217 | 57 + tests/data/test1218 | 64 + tests/data/test1219 | 49 + tests/data/test122 | 45 + tests/data/test1220 | 37 + tests/data/test1221 | 53 + tests/data/test1222 | 53 + tests/data/test1223 | 60 + tests/data/test1224 | 49 + tests/data/test1225 | 56 + tests/data/test1226 | 49 + tests/data/test1227 | 48 + tests/data/test1228 | 58 + tests/data/test1229 | 83 + tests/data/test123 | 40 + tests/data/test1230 | 79 + tests/data/test1231 | 61 + tests/data/test1232 | 68 + tests/data/test1233 | 47 + tests/data/test1234 | 33 + tests/data/test1235 | 95 + tests/data/test1236 | 33 + tests/data/test1237 | 47 + tests/data/test1238 | 52 + tests/data/test1239 | 68 + tests/data/test124 | 47 + tests/data/test1240 | 48 + tests/data/test1241 | 67 + tests/data/test1242 | 43 + tests/data/test1243 | 44 + tests/data/test1244 | 61 + tests/data/test1245 | 63 + tests/data/test1246 | 67 + tests/data/test1247 | 38 + tests/data/test1248 | 49 + tests/data/test1249 | 52 + tests/data/test125 | 41 + tests/data/test1250 | 53 + tests/data/test1251 | 54 + tests/data/test1252 | 52 + tests/data/test1253 | 56 + tests/data/test1254 | 56 + tests/data/test1255 | 53 + tests/data/test1256 | 57 + tests/data/test1257 | 57 + tests/data/test1258 | 54 + tests/data/test1259 | 47 + tests/data/test126 | 48 + tests/data/test1260 | 36 + tests/data/test1261 | 61 + tests/data/test1262 | 40 + tests/data/test1263 | 37 + tests/data/test1264 | 36 + tests/data/test1265 | 53 + tests/data/test1266 | 46 + tests/data/test1267 | 46 + tests/data/test1268 | 41 + tests/data/test1269 | 34 + tests/data/test127 | 46 + tests/data/test1270 | 69 + tests/data/test1271 | 48 + tests/data/test128 | 57 + tests/data/test1280 | 58 + tests/data/test1281 | 38 + tests/data/test1282 | 45 + tests/data/test1283 | 57 + tests/data/test1284 | 89 + tests/data/test1285 | 97 + tests/data/test1286 | 110 + tests/data/test1287 | 94 + tests/data/test1288 | 99 + tests/data/test1289 | 35 + tests/data/test129 | 52 + tests/data/test1290 | 48 + tests/data/test1291 | 44 + tests/data/test1292 | 50 + tests/data/test1293 | 67 + tests/data/test1298 | 56 + tests/data/test1299 | 55 + tests/data/test13 | 44 + tests/data/test130 | 64 + tests/data/test1300 | 22 + tests/data/test1301 | 22 + tests/data/test1302 | 22 + tests/data/test1303 | 22 + tests/data/test1304 | 26 + tests/data/test1305 | 26 + tests/data/test1306 | 30 + tests/data/test1307 | 24 + tests/data/test1308 | 27 + tests/data/test1309 | 1564 ++++ tests/data/test131 | 63 + tests/data/test1310 | 125 + tests/data/test1311 | 64 + tests/data/test1312 | 64 + tests/data/test1313 | 64 + tests/data/test1314 | 82 + tests/data/test1315 | 83 + tests/data/test1316 | 81 + tests/data/test1317 | 56 + tests/data/test1318 | 60 + tests/data/test1319 | 84 + tests/data/test132 | 62 + tests/data/test1320 | 74 + tests/data/test1321 | 80 + tests/data/test1322 | 57 + tests/data/test1323 | 32 + tests/data/test1324 | 56 + tests/data/test1325 | 80 + tests/data/test1326 | 48 + tests/data/test1327 | 47 + tests/data/test1328 | 71 + tests/data/test1329 | 33 + tests/data/test133 | 62 + tests/data/test1330 | 46 + tests/data/test1331 | 92 + tests/data/test1332 | 80 + tests/data/test1333 | 55 + tests/data/test1334 | 76 + tests/data/test1335 | 73 + tests/data/test1336 | 81 + tests/data/test1337 | 78 + tests/data/test1338 | 77 + tests/data/test1339 | 74 + tests/data/test134 | 62 + tests/data/test1340 | 80 + tests/data/test1341 | 77 + tests/data/test1342 | 83 + tests/data/test1343 | 80 + tests/data/test1344 | 89 + tests/data/test1345 | 86 + tests/data/test1346 | 73 + tests/data/test1347 | 78 + tests/data/test1348 | 61 + tests/data/test1349 | 83 + tests/data/test135 | 54 + tests/data/test1350 | 80 + tests/data/test1351 | 84 + tests/data/test1352 | 81 + tests/data/test1353 | 83 + tests/data/test1354 | 78 + tests/data/test1355 | 61 + tests/data/test1356 | 79 + tests/data/test1357 | 99 + tests/data/test1358 | 96 + tests/data/test1359 | 100 + tests/data/test136 | 42 + tests/data/test1360 | 97 + tests/data/test1361 | 99 + tests/data/test1362 | 96 + tests/data/test1363 | 79 + tests/data/test1364 | 71 + tests/data/test1365 | 68 + tests/data/test1366 | 73 + tests/data/test1367 | 70 + tests/data/test1368 | 72 + tests/data/test1369 | 69 + tests/data/test137 | 47 + tests/data/test1370 | 74 + tests/data/test1371 | 71 + tests/data/test1372 | 78 + tests/data/test1373 | 75 + tests/data/test1374 | 81 + tests/data/test1375 | 78 + tests/data/test1376 | 68 + tests/data/test1377 | 70 + tests/data/test1378 | 56 + tests/data/test1379 | 76 + tests/data/test138 | 49 + tests/data/test1380 | 73 + tests/data/test1381 | 77 + tests/data/test1382 | 74 + tests/data/test1383 | 76 + tests/data/test1384 | 73 + tests/data/test1385 | 56 + tests/data/test1386 | 71 + tests/data/test1387 | 91 + tests/data/test1388 | 88 + tests/data/test1389 | 92 + tests/data/test139 | 47 + tests/data/test1390 | 89 + tests/data/test1391 | 91 + tests/data/test1392 | 88 + tests/data/test1393 | 71 + tests/data/test1394 | 26 + tests/data/test1395 | 21 + tests/data/test1396 | 24 + tests/data/test1397 | 24 + tests/data/test1398 | 23 + tests/data/test1399 | 22 + tests/data/test14 | 44 + tests/data/test140 | 42 + tests/data/test1400 | 110 + tests/data/test1401 | 129 + tests/data/test1402 | 115 + tests/data/test1403 | 110 + tests/data/test1404 | 187 + tests/data/test1405 | 143 + tests/data/test1406 | 129 + tests/data/test1407 | 107 + tests/data/test1408 | 73 + tests/data/test1409 | 31 + tests/data/test141 | 52 + tests/data/test1410 | 31 + tests/data/test1411 | 60 + tests/data/test1412 | 136 + tests/data/test1413 | 73 + tests/data/test1414 | 57 + tests/data/test1415 | 78 + tests/data/test1416 | 63 + tests/data/test1417 | 79 + tests/data/test1418 | 121 + tests/data/test1419 | 69 + tests/data/test142 | 190 + tests/data/test1420 | 111 + tests/data/test1421 | 75 + tests/data/test1422 | 64 + tests/data/test1423 | 57 + tests/data/test1424 | 76 + tests/data/test1425 | Bin 0 -> 1726 bytes tests/data/test1426 | Bin 0 -> 1663 bytes tests/data/test1427 | 29 + tests/data/test1428 | 84 + tests/data/test1429 | 70 + tests/data/test143 | 45 + tests/data/test1430 | 53 + tests/data/test1431 | 53 + tests/data/test1432 | 54 + tests/data/test1433 | 57 + tests/data/test1434 | 90 + tests/data/test1435 | 46 + tests/data/test1436 | 85 + tests/data/test1437 | 84 + tests/data/test1438 | 58 + tests/data/test1439 | 58 + tests/data/test144 | 49 + tests/data/test1440 | 35 + tests/data/test1441 | 35 + tests/data/test1442 | 35 + tests/data/test1443 | 68 + tests/data/test1444 | 52 + tests/data/test1445 | 35 + tests/data/test1446 | 42 + tests/data/test1447 | 39 + tests/data/test1448 | 92 + tests/data/test1449 | 38 + tests/data/test145 | 51 + tests/data/test1450 | 34 + tests/data/test1451 | 36 + tests/data/test1452 | 42 + tests/data/test1453 | 38 + tests/data/test1454 | 38 + tests/data/test1455 | 65 + tests/data/test1456 | 70 + tests/data/test1457 | 61 + tests/data/test1458 | 56 + tests/data/test1459 | 46 + tests/data/test146 | 55 + tests/data/test147 | 55 + tests/data/test148 | 49 + tests/data/test149 | 53 + tests/data/test15 | 57 + tests/data/test150 | 104 + tests/data/test1500 | 44 + tests/data/test1501 | 53 + tests/data/test1502 | 58 + tests/data/test1503 | 58 + tests/data/test1504 | 58 + tests/data/test1505 | 58 + tests/data/test1506 | 96 + tests/data/test1507 | 51 + tests/data/test1508 | 31 + tests/data/test1509 | 90 + tests/data/test151 | 48 + tests/data/test1510 | 96 + tests/data/test1511 | 70 + tests/data/test1512 | 80 + tests/data/test1513 | 49 + tests/data/test1514 | 63 + tests/data/test1515 | 62 + tests/data/test1516 | 58 + tests/data/test1517 | 69 + tests/data/test1518 | 62 + tests/data/test1519 | 62 + tests/data/test152 | 52 + tests/data/test1520 | 63 + tests/data/test1521 | 30 + tests/data/test1522 | 53 + tests/data/test1523 | 49 + tests/data/test1525 | 77 + tests/data/test1526 | 79 + tests/data/test1527 | 79 + tests/data/test1528 | 63 + tests/data/test1529 | 46 + tests/data/test153 | 156 + tests/data/test1530 | 30 + tests/data/test1531 | Bin 0 -> 552 bytes tests/data/test1532 | 49 + tests/data/test1533 | 74 + tests/data/test1534 | 50 + tests/data/test1535 | 50 + tests/data/test1536 | 50 + tests/data/test1537 | 45 + tests/data/test1538 | 156 + tests/data/test154 | 109 + tests/data/test1540 | 64 + tests/data/test1541 | 34 + tests/data/test155 | 141 + tests/data/test1550 | 29 + tests/data/test1551 | 72 + tests/data/test1552 | 52 + tests/data/test1553 | 54 + tests/data/test1554 | 85 + tests/data/test1555 | 50 + tests/data/test1556 | 63 + tests/data/test1557 | 36 + tests/data/test1558 | 46 + tests/data/test1559 | 44 + tests/data/test156 | 60 + tests/data/test1560 | 47 + tests/data/test1561 | 106 + tests/data/test1562 | 72 + tests/data/test1563 | 51 + tests/data/test1564 | 31 + tests/data/test1565 | 41 + tests/data/test157 | 47 + tests/data/test158 | 56 + tests/data/test159 | 84 + tests/data/test1590 | 54 + tests/data/test1591 | 63 + tests/data/test1592 | 37 + tests/data/test1593 | 49 + tests/data/test1594 | 52 + tests/data/test1595 | 51 + tests/data/test1596 | 52 + tests/data/test16 | 55 + tests/data/test160 | 73 + tests/data/test1600 | 23 + tests/data/test1601 | 22 + tests/data/test1602 | 22 + tests/data/test1603 | 22 + tests/data/test1604 | 21 + tests/data/test1605 | 21 + tests/data/test1606 | 22 + tests/data/test1607 | 22 + tests/data/test1608 | 22 + tests/data/test1609 | 22 + tests/data/test161 | 51 + tests/data/test1610 | 22 + tests/data/test1611 | 22 + tests/data/test1612 | 22 + tests/data/test162 | 63 + tests/data/test1620 | 22 + tests/data/test1621 | 23 + tests/data/test163 | 79 + tests/data/test164 | 68 + tests/data/test165 | 68 + tests/data/test1650 | 23 + tests/data/test1651 | 22 + tests/data/test1652 | 20 + tests/data/test1653 | 20 + tests/data/test1654 | 56 + tests/data/test1655 | 23 + tests/data/test166 | 60 + tests/data/test167 | 81 + tests/data/test168 | 101 + tests/data/test169 | 131 + tests/data/test17 | 54 + tests/data/test170 | 54 + tests/data/test1700 | 101 + tests/data/test1701 | 83 + tests/data/test1702 | 78 + tests/data/test171 | 61 + tests/data/test172 | 56 + tests/data/test173 | 79 + tests/data/test174 | 52 + tests/data/test175 | 86 + tests/data/test176 | 89 + tests/data/test177 | 54 + tests/data/test178 | 57 + tests/data/test179 | 60 + tests/data/test18 | 91 + tests/data/test180 | 67 + tests/data/test1800 | 55 + tests/data/test1801 | 69 + tests/data/test181 | 68 + tests/data/test182 | 43 + tests/data/test183 | 59 + tests/data/test184 | 78 + tests/data/test185 | 78 + tests/data/test186 | 62 + tests/data/test187 | 77 + tests/data/test188 | 78 + tests/data/test189 | 76 + tests/data/test19 | 37 + tests/data/test190 | 44 + tests/data/test1900 | 61 + tests/data/test1901 | 63 + tests/data/test1902 | 62 + tests/data/test1903 | 62 + tests/data/test1904 | 82 + tests/data/test1905 | 60 + tests/data/test1906 | 52 + tests/data/test1907 | 53 + tests/data/test1908 | 71 + tests/data/test191 | 41 + tests/data/test192 | 59 + tests/data/test193 | 82 + tests/data/test194 | 73 + tests/data/test195 | 38 + tests/data/test196 | 42 + tests/data/test197 | 76 + tests/data/test198 | 71 + tests/data/test199 | 59 + tests/data/test2 | 53 + tests/data/test20 | 38 + tests/data/test200 | 41 + tests/data/test2000 | 73 + tests/data/test2001 | 98 + tests/data/test2002 | 117 + tests/data/test2003 | 146 + tests/data/test2004 | 78 + tests/data/test2005 | 93 + tests/data/test2006 | 120 + tests/data/test2007 | 121 + tests/data/test2008 | 113 + tests/data/test2009 | 114 + tests/data/test201 | 34 + tests/data/test2010 | 113 + tests/data/test2011 | 93 + tests/data/test2012 | 92 + tests/data/test2013 | 78 + tests/data/test2014 | 78 + tests/data/test2015 | 78 + tests/data/test2016 | 78 + tests/data/test2017 | 78 + tests/data/test2018 | 78 + tests/data/test2019 | 78 + tests/data/test202 | 37 + tests/data/test2020 | 78 + tests/data/test2021 | 78 + tests/data/test2022 | 78 + tests/data/test2023 | 162 + tests/data/test2024 | 176 + tests/data/test2025 | 273 + tests/data/test2026 | 220 + tests/data/test2027 | 248 + tests/data/test2028 | 317 + tests/data/test2029 | 241 + tests/data/test203 | 46 + tests/data/test2030 | 298 + tests/data/test2031 | 322 + tests/data/test2032 | 124 + tests/data/test2033 | 125 + tests/data/test2034 | 58 + tests/data/test2035 | 44 + tests/data/test2036 | 39 + tests/data/test2037 | 58 + tests/data/test2038 | 44 + tests/data/test2039 | 63 + tests/data/test204 | 40 + tests/data/test2040 | 69 + tests/data/test2041 | 58 + tests/data/test2042 | 44 + tests/data/test2043 | 33 + tests/data/test2044 | 33 + tests/data/test2045 | 54 + tests/data/test2046 | 98 + tests/data/test2047 | 101 + tests/data/test2048 | 40 + tests/data/test2049 | 64 + tests/data/test205 | 38 + tests/data/test2050 | 81 + tests/data/test2051 | 74 + tests/data/test2052 | 68 + tests/data/test2053 | 56 + tests/data/test2054 | 64 + tests/data/test2055 | 82 + tests/data/test2056 | 67 + tests/data/test2057 | 88 + tests/data/test2058 | 108 + tests/data/test2059 | 108 + tests/data/test206 | 109 + tests/data/test2060 | 108 + tests/data/test2061 | 84 + tests/data/test2062 | 84 + tests/data/test2063 | 84 + tests/data/test2064 | 84 + tests/data/test2065 | 84 + tests/data/test2066 | 84 + tests/data/test2067 | 89 + tests/data/test2068 | 89 + tests/data/test2069 | 89 + tests/data/test207 | 67 + tests/data/test2071 | 41 + tests/data/test2072 | 44 + tests/data/test2073 | 68 + tests/data/test2074 | 57 + tests/data/test2075 | 34 + tests/data/test2076 | 75 + tests/data/test2077 | 42 + tests/data/test2078 | 54 + tests/data/test208 | 76 + tests/data/test2080 | Bin 0 -> 20659 bytes tests/data/test209 | 125 + tests/data/test21 | 33 + tests/data/test210 | 52 + tests/data/test2100 | Bin 0 -> 1642 bytes tests/data/test211 | 54 + tests/data/test212 | 64 + tests/data/test213 | 128 + tests/data/test214 | 54 + tests/data/test215 | 58 + tests/data/test216 | 45 + tests/data/test217 | 63 + tests/data/test218 | 59 + tests/data/test219 | 38 + tests/data/test22 | 46 + tests/data/test220 | 71 + tests/data/test221 | 74 + tests/data/test222 | 202 + tests/data/test223 | 95 + tests/data/test224 | 107 + tests/data/test225 | 28 + tests/data/test226 | 29 + tests/data/test227 | 57 + tests/data/test228 | 52 + tests/data/test229 | 41 + tests/data/test23 | 33 + tests/data/test230 | 203 + tests/data/test231 | 38 + tests/data/test232 | 202 + tests/data/test233 | 97 + tests/data/test234 | 100 + tests/data/test235 | 48 + tests/data/test236 | 52 + tests/data/test237 | 44 + tests/data/test238 | 42 + tests/data/test239 | 104 + tests/data/test24 | 50 + tests/data/test240 | 58 + tests/data/test241 | 56 + tests/data/test242 | 54 + tests/data/test243 | 133 + tests/data/test244 | 54 + tests/data/test245 | 88 + tests/data/test246 | 98 + tests/data/test247 | 47 + tests/data/test248 | 56 + tests/data/test249 | 53 + tests/data/test25 | 116 + tests/data/test250 | 58 + tests/data/test251 | 60 + tests/data/test252 | 60 + tests/data/test253 | 63 + tests/data/test254 | 61 + tests/data/test255 | 64 + tests/data/test256 | 67 + tests/data/test257 | 114 + tests/data/test258 | 136 + tests/data/test259 | 134 + tests/data/test26 | 45 + tests/data/test260 | 55 + tests/data/test261 | 48 + tests/data/test262 | Bin 0 -> 1137 bytes tests/data/test263 | 55 + tests/data/test264 | 52 + tests/data/test265 | 129 + tests/data/test266 | 79 + tests/data/test267 | 112 + tests/data/test268 | 57 + tests/data/test269 | 53 + tests/data/test27 | 56 + tests/data/test270 | 50 + tests/data/test271 | 46 + tests/data/test272 | 40 + tests/data/test273 | 84 + tests/data/test274 | 52 + tests/data/test275 | 91 + tests/data/test276 | 76 + tests/data/test277 | 58 + tests/data/test278 | 52 + tests/data/test279 | 53 + tests/data/test28 | 75 + tests/data/test280 | 63 + tests/data/test281 | 65 + tests/data/test282 | 45 + tests/data/test283 | 39 + tests/data/test284 | 70 + tests/data/test285 | 47 + tests/data/test286 | 95 + tests/data/test287 | 56 + tests/data/test288 | 48 + tests/data/test289 | 30 + tests/data/test29 | 52 + tests/data/test290 | 43 + tests/data/test291 | 47 + tests/data/test292 | 56 + tests/data/test293 | 60 + tests/data/test294 | 64 + tests/data/test295 | 45 + tests/data/test296 | 48 + tests/data/test297 | 46 + tests/data/test298 | 45 + tests/data/test299 | 54 + tests/data/test3 | 60 + tests/data/test30 | 43 + tests/data/test300 | 52 + tests/data/test3000 | 57 + tests/data/test3001 | 57 + tests/data/test3002 | 55 + tests/data/test3003 | 55 + tests/data/test3004 | 55 + tests/data/test3005 | 55 + tests/data/test3006 | 51 + tests/data/test3007 | 47 + tests/data/test301 | 57 + tests/data/test302 | 51 + tests/data/test303 | 55 + tests/data/test304 | 71 + tests/data/test305 | 35 + tests/data/test306 | 65 + tests/data/test307 | 56 + tests/data/test308 | 35 + tests/data/test309 | 86 + tests/data/test31 | 119 + tests/data/test310 | 57 + tests/data/test311 | 43 + tests/data/test312 | 43 + tests/data/test313 | 39 + tests/data/test314 | 198 + tests/data/test315 | 91 + tests/data/test316 | 198 + tests/data/test317 | 97 + tests/data/test318 | 98 + tests/data/test319 | 57 + tests/data/test32 | 56 + tests/data/test320 | 80 + tests/data/test321 | 33 + tests/data/test322 | 33 + tests/data/test323 | 33 + tests/data/test324 | 33 + tests/data/test325 | 66 + tests/data/test326 | 66 + tests/data/test327 | 73 + tests/data/test328 | 55 + tests/data/test329 | 70 + tests/data/test33 | 64 + tests/data/test330 | 93 + tests/data/test331 | 68 + tests/data/test332 | 45 + tests/data/test333 | 35 + tests/data/test334 | 44 + tests/data/test335 | 103 + tests/data/test336 | 58 + tests/data/test337 | 58 + tests/data/test338 | 63 + tests/data/test339 | 63 + tests/data/test34 | 66 + tests/data/test340 | 40 + tests/data/test341 | 57 + tests/data/test342 | 58 + tests/data/test343 | 61 + tests/data/test35 | Bin 0 -> 810 bytes tests/data/test350 | 57 + tests/data/test351 | 56 + tests/data/test352 | 57 + tests/data/test353 | 56 + tests/data/test354 | 50 + tests/data/test355 | 57 + tests/data/test356 | 70 + tests/data/test357 | 97 + tests/data/test36 | 66 + tests/data/test37 | 47 + tests/data/test38 | 61 + tests/data/test39 | 108 + tests/data/test393 | 60 + tests/data/test394 | 59 + tests/data/test395 | 55 + tests/data/test4 | 62 + tests/data/test40 | 74 + tests/data/test400 | 62 + tests/data/test401 | 57 + tests/data/test402 | 36 + tests/data/test403 | 65 + tests/data/test404 | 32 + tests/data/test405 | 35 + tests/data/test406 | 67 + tests/data/test407 | 60 + tests/data/test408 | 62 + tests/data/test409 | 57 + tests/data/test41 | 32 + tests/data/test42 | 74 + tests/data/test43 | 82 + tests/data/test44 | 72 + tests/data/test45 | 76 + tests/data/test46 | 89 + tests/data/test47 | 49 + tests/data/test48 | 54 + tests/data/test49 | 74 + tests/data/test490 | 68 + tests/data/test491 | 64 + tests/data/test492 | 89 + tests/data/test5 | 53 + tests/data/test50 | 74 + tests/data/test500 | 58 + tests/data/test501 | 40 + tests/data/test502 | 47 + tests/data/test503 | 89 + tests/data/test504 | 46 + tests/data/test505 | 66 + tests/data/test506 | 250 + tests/data/test507 | 37 + tests/data/test508 | 58 + tests/data/test509 | 44 + tests/data/test51 | 74 + tests/data/test510 | 65 + tests/data/test511 | 50 + tests/data/test512 | 53 + tests/data/test513 | 49 + tests/data/test514 | 57 + tests/data/test515 | 54 + tests/data/test516 | 54 + tests/data/test517 | 45 + tests/data/test518 | 67 + tests/data/test519 | 78 + tests/data/test52 | 74 + tests/data/test520 | 53 + tests/data/test521 | 60 + tests/data/test522 | 60 + tests/data/test523 | 67 + tests/data/test524 | 46 + tests/data/test525 | 59 + tests/data/test526 | 63 + tests/data/test527 | 63 + tests/data/test528 | 65 + tests/data/test529 | 59 + tests/data/test53 | 54 + tests/data/test530 | 83 + tests/data/test531 | 59 + tests/data/test532 | 63 + tests/data/test533 | 55 + tests/data/test534 | 53 + tests/data/test535 | 69 + tests/data/test537 | 64 + tests/data/test538 | 45 + tests/data/test539 | 71 + tests/data/test54 | 45 + tests/data/test540 | 111 + tests/data/test541 | 57 + tests/data/test542 | 57 + tests/data/test543 | 35 + tests/data/test544 | 56 + tests/data/test545 | Bin 0 -> 798 bytes tests/data/test546 | 70 + tests/data/test547 | 137 + tests/data/test548 | 137 + tests/data/test549 | 66 + tests/data/test55 | 66 + tests/data/test550 | 66 + tests/data/test551 | 101 + tests/data/test552 | Bin 0 -> 142941 bytes tests/data/test553 | 65 + tests/data/test554 | 132 + tests/data/test555 | 142 + tests/data/test556 | 50 + tests/data/test557 | 47 + tests/data/test558 | 56 + tests/data/test559 | 50 + tests/data/test56 | 61 + tests/data/test560 | 56 + tests/data/test561 | 67 + tests/data/test562 | 53 + tests/data/test563 | 59 + tests/data/test564 | 68 + tests/data/test565 | 109 + tests/data/test566 | 57 + tests/data/test567 | 49 + tests/data/test568 | 116 + tests/data/test569 | 110 + tests/data/test57 | 48 + tests/data/test570 | 76 + tests/data/test571 | 107 + tests/data/test572 | 121 + tests/data/test573 | 58 + tests/data/test574 | 98 + tests/data/test575 | 121 + tests/data/test576 | 192 + tests/data/test577 | 55 + tests/data/test578 | 52 + tests/data/test579 | 87 + tests/data/test58 | 51 + tests/data/test580 | 58 + tests/data/test581 | 58 + tests/data/test582 | 49 + tests/data/test583 | 45 + tests/data/test584 | 102 + tests/data/test585 | 69 + tests/data/test586 | 59 + tests/data/test587 | 58 + tests/data/test588 | 69 + tests/data/test589 | 55 + tests/data/test59 | 47 + tests/data/test590 | 127 + tests/data/test591 | 73 + tests/data/test592 | 74 + tests/data/test593 | 72 + tests/data/test594 | 72 + tests/data/test595 | 57 + tests/data/test596 | 60 + tests/data/test597 | 36 + tests/data/test598 | 80 + tests/data/test599 | 86 + tests/data/test6 | 49 + tests/data/test60 | 58 + tests/data/test600 | 42 + tests/data/test601 | 42 + tests/data/test602 | 43 + tests/data/test603 | 43 + tests/data/test604 | 33 + tests/data/test605 | 33 + tests/data/test606 | 33 + tests/data/test607 | 33 + tests/data/test608 | 49 + tests/data/test609 | 45 + tests/data/test61 | 72 + tests/data/test610 | 47 + tests/data/test611 | 47 + tests/data/test612 | 47 + tests/data/test613 | 48 + tests/data/test614 | 49 + tests/data/test615 | 44 + tests/data/test616 | 39 + tests/data/test617 | 39 + tests/data/test618 | 39 + tests/data/test619 | 39 + tests/data/test62 | 65 + tests/data/test620 | 38 + tests/data/test621 | 38 + tests/data/test622 | 43 + tests/data/test623 | 44 + tests/data/test624 | 47 + tests/data/test625 | 47 + tests/data/test626 | 42 + tests/data/test627 | 46 + tests/data/test628 | 33 + tests/data/test629 | 33 + tests/data/test63 | 55 + tests/data/test630 | 34 + tests/data/test631 | 34 + tests/data/test632 | 34 + tests/data/test633 | 42 + tests/data/test634 | 43 + tests/data/test635 | 42 + tests/data/test636 | 43 + tests/data/test637 | 44 + tests/data/test638 | 49 + tests/data/test639 | 49 + tests/data/test64 | 84 + tests/data/test640 | 41 + tests/data/test641 | 41 + tests/data/test642 | 42 + tests/data/test643 | 131 + tests/data/test644 | 60 + tests/data/test645 | 193 + tests/data/test646 | 98 + tests/data/test647 | 79 + tests/data/test648 | 75 + tests/data/test649 | 72 + tests/data/test65 | 84 + tests/data/test650 | 133 + tests/data/test651 | 72 + tests/data/test652 | 358 + tests/data/test653 | 93 + tests/data/test654 | 123 + tests/data/test655 | 50 + tests/data/test656 | 33 + tests/data/test658 | 52 + tests/data/test659 | 57 + tests/data/test66 | 42 + tests/data/test660 | 34 + tests/data/test661 | 73 + tests/data/test662 | 78 + tests/data/test663 | 82 + tests/data/test664 | 44 + tests/data/test665 | 44 + tests/data/test666 | 293 + tests/data/test667 | 85 + tests/data/test668 | 99 + tests/data/test67 | 103 + tests/data/test670 | 72 + tests/data/test671 | 72 + tests/data/test672 | 72 + tests/data/test673 | 72 + tests/data/test68 | 102 + tests/data/test69 | 124 + tests/data/test7 | 62 + tests/data/test70 | 88 + tests/data/test700 | 57 + tests/data/test701 | 57 + tests/data/test702 | 44 + tests/data/test703 | 44 + tests/data/test704 | 39 + tests/data/test705 | 39 + tests/data/test706 | 59 + tests/data/test707 | 59 + tests/data/test708 | 60 + tests/data/test709 | 60 + tests/data/test71 | 78 + tests/data/test710 | 57 + tests/data/test711 | 54 + tests/data/test712 | 48 + tests/data/test713 | 49 + tests/data/test714 | 68 + tests/data/test715 | 70 + tests/data/test716 | 45 + tests/data/test717 | 68 + tests/data/test72 | 87 + tests/data/test73 | 55 + tests/data/test74 | 75 + tests/data/test75 | 52 + tests/data/test76 | 39 + tests/data/test77 | 56 + tests/data/test78 | 68 + tests/data/test79 | 56 + tests/data/test8 | 69 + tests/data/test80 | 86 + tests/data/test800 | 49 + tests/data/test801 | 46 + tests/data/test802 | 47 + tests/data/test803 | 45 + tests/data/test804 | 47 + tests/data/test805 | 62 + tests/data/test806 | 44 + tests/data/test807 | 45 + tests/data/test808 | 49 + tests/data/test809 | 43 + tests/data/test81 | 105 + tests/data/test810 | 43 + tests/data/test811 | 40 + tests/data/test812 | 40 + tests/data/test813 | 40 + tests/data/test814 | 41 + tests/data/test815 | 46 + tests/data/test816 | 49 + tests/data/test817 | 40 + tests/data/test818 | 46 + tests/data/test819 | 56 + tests/data/test82 | 57 + tests/data/test820 | 57 + tests/data/test821 | 59 + tests/data/test822 | 72 + tests/data/test823 | 63 + tests/data/test824 | 56 + tests/data/test825 | 56 + tests/data/test826 | 57 + tests/data/test827 | 72 + tests/data/test828 | 56 + tests/data/test829 | 29 + tests/data/test83 | 82 + tests/data/test830 | 56 + tests/data/test831 | 68 + tests/data/test832 | 58 + tests/data/test833 | 65 + tests/data/test834 | 77 + tests/data/test835 | 67 + tests/data/test836 | 59 + tests/data/test837 | 56 + tests/data/test838 | 56 + tests/data/test839 | 56 + tests/data/test84 | 57 + tests/data/test840 | 56 + tests/data/test841 | 51 + tests/data/test842 | 62 + tests/data/test843 | 62 + tests/data/test844 | 60 + tests/data/test845 | 59 + tests/data/test846 | 50 + tests/data/test847 | 49 + tests/data/test848 | 56 + tests/data/test849 | 51 + tests/data/test85 | 61 + tests/data/test850 | 49 + tests/data/test851 | 44 + tests/data/test852 | 47 + tests/data/test853 | 52 + tests/data/test854 | 45 + tests/data/test855 | 47 + tests/data/test856 | 48 + tests/data/test857 | 60 + tests/data/test858 | 41 + tests/data/test859 | 41 + tests/data/test86 | 97 + tests/data/test860 | 41 + tests/data/test861 | 52 + tests/data/test862 | 50 + tests/data/test863 | 41 + tests/data/test864 | 54 + tests/data/test865 | 57 + tests/data/test866 | 58 + tests/data/test867 | 60 + tests/data/test868 | 73 + tests/data/test869 | 64 + tests/data/test87 | 61 + tests/data/test870 | 57 + tests/data/test871 | 56 + tests/data/test872 | 57 + tests/data/test873 | 72 + tests/data/test874 | 56 + tests/data/test875 | 29 + tests/data/test876 | 57 + tests/data/test877 | 69 + tests/data/test878 | 59 + tests/data/test879 | 66 + tests/data/test88 | 101 + tests/data/test880 | 78 + tests/data/test881 | 68 + tests/data/test882 | 58 + tests/data/test883 | 57 + tests/data/test884 | 57 + tests/data/test885 | 56 + tests/data/test886 | 56 + tests/data/test887 | 63 + tests/data/test888 | 62 + tests/data/test889 | 61 + tests/data/test89 | 148 + tests/data/test890 | 60 + tests/data/test891 | 47 + tests/data/test892 | 57 + tests/data/test893 | 53 + tests/data/test894 | 37 + tests/data/test9 | 72 + tests/data/test90 | 194 + tests/data/test900 | 51 + tests/data/test901 | 63 + tests/data/test902 | 57 + tests/data/test903 | 56 + tests/data/test904 | 57 + tests/data/test905 | 59 + tests/data/test906 | 72 + tests/data/test907 | 63 + tests/data/test908 | 56 + tests/data/test909 | 51 + tests/data/test91 | 125 + tests/data/test910 | 51 + tests/data/test911 | 46 + tests/data/test912 | 55 + tests/data/test913 | 50 + tests/data/test914 | 46 + tests/data/test915 | 51 + tests/data/test916 | 47 + tests/data/test917 | 55 + tests/data/test918 | 48 + tests/data/test919 | 55 + tests/data/test92 | 69 + tests/data/test920 | 56 + tests/data/test921 | 71 + tests/data/test922 | 55 + tests/data/test923 | 37 + tests/data/test924 | 43 + tests/data/test925 | 40 + tests/data/test926 | 44 + tests/data/test927 | 43 + tests/data/test928 | 41 + tests/data/test929 | 38 + tests/data/test93 | 53 + tests/data/test930 | 38 + tests/data/test931 | 29 + tests/data/test932 | 56 + tests/data/test933 | 68 + tests/data/test934 | 58 + tests/data/test935 | 65 + tests/data/test936 | 77 + tests/data/test937 | 67 + tests/data/test938 | 65 + tests/data/test939 | 50 + tests/data/test94 | 59 + tests/data/test940 | 45 + tests/data/test941 | 66 + tests/data/test942 | 56 + tests/data/test943 | 56 + tests/data/test944 | 55 + tests/data/test945 | 55 + tests/data/test946 | 62 + tests/data/test947 | 61 + tests/data/test948 | 63 + tests/data/test949 | 62 + tests/data/test95 | 84 + tests/data/test950 | 43 + tests/data/test951 | 45 + tests/data/test952 | 45 + tests/data/test953 | 56 + tests/data/test954 | 55 + tests/data/test955 | 56 + tests/data/test956 | 57 + tests/data/test957 | 51 + tests/data/test958 | 51 + tests/data/test959 | 57 + tests/data/test96 | 46 + tests/data/test960 | 58 + tests/data/test961 | 52 + tests/data/test962 | 63 + tests/data/test963 | 63 + tests/data/test964 | 49 + tests/data/test965 | 66 + tests/data/test966 | 66 + tests/data/test967 | 55 + tests/data/test968 | 52 + tests/data/test969 | 51 + tests/data/test97 | 52 + tests/data/test98 | 55 + tests/data/test99 | 69 + tests/dictserver.py | 161 + tests/directories.pm | 287 + tests/disable-scan.pl | 134 + tests/error-codes.pl | 80 + tests/extern-scan.pl | 62 + tests/ftp.pm | 360 + tests/ftpserver.pl | 3279 ++++++++ tests/fuzz/README | 8 + tests/fuzz/download_fuzzer.sh | 7 + tests/getpart.pm | 294 + tests/http2-server.pl | 83 + tests/httpserver.pl | 143 + tests/keywords.pl | 153 + tests/libtest/.gitignore | 7 + tests/libtest/CMakeLists.txt | 136 + tests/libtest/Makefile.am | 145 + tests/libtest/Makefile.inc | 615 ++ tests/libtest/chkdecimalpoint.c | 41 + tests/libtest/chkhostname.c | 47 + tests/libtest/first.c | 183 + tests/libtest/lib1156.c | 162 + tests/libtest/lib1500.c | 90 + tests/libtest/lib1501.c | 111 + tests/libtest/lib1502.c | 156 + tests/libtest/lib1506.c | 137 + tests/libtest/lib1507.c | 149 + tests/libtest/lib1508.c | 49 + tests/libtest/lib1509.c | 97 + tests/libtest/lib1510.c | 99 + tests/libtest/lib1511.c | 75 + tests/libtest/lib1512.c | 90 + tests/libtest/lib1513.c | 74 + tests/libtest/lib1514.c | 80 + tests/libtest/lib1515.c | 154 + tests/libtest/lib1517.c | 116 + tests/libtest/lib1518.c | 74 + tests/libtest/lib1520.c | 113 + tests/libtest/lib1522.c | 90 + tests/libtest/lib1523.c | 82 + tests/libtest/lib1525.c | 98 + tests/libtest/lib1526.c | 103 + tests/libtest/lib1527.c | 100 + tests/libtest/lib1528.c | 73 + tests/libtest/lib1529.c | 61 + tests/libtest/lib1530.c | 68 + tests/libtest/lib1531.c | 157 + tests/libtest/lib1532.c | 80 + tests/libtest/lib1533.c | 199 + tests/libtest/lib1534.c | 129 + tests/libtest/lib1535.c | 128 + tests/libtest/lib1536.c | 129 + tests/libtest/lib1537.c | 89 + tests/libtest/lib1538.c | 52 + tests/libtest/lib1540.c | 119 + tests/libtest/lib1541.c | 151 + tests/libtest/lib1550.c | 46 + tests/libtest/lib1551.c | 47 + tests/libtest/lib1552.c | 93 + tests/libtest/lib1553.c | 109 + tests/libtest/lib1554.c | 90 + tests/libtest/lib1555.c | 79 + tests/libtest/lib1556.c | 78 + tests/libtest/lib1557.c | 62 + tests/libtest/lib1558.c | 65 + tests/libtest/lib1559.c | 74 + tests/libtest/lib1560.c | 1087 +++ tests/libtest/lib1564.c | 142 + tests/libtest/lib1565.c | 204 + tests/libtest/lib1591.c | 118 + tests/libtest/lib1592.c | 119 + tests/libtest/lib1593.c | 79 + tests/libtest/lib1594.c | 66 + tests/libtest/lib1900.c | 248 + tests/libtest/lib1905.c | 93 + tests/libtest/lib1906.c | 72 + tests/libtest/lib1907.c | 54 + tests/libtest/lib1908.c | 47 + tests/libtest/lib500.c | 156 + tests/libtest/lib501.c | 58 + tests/libtest/lib502.c | 91 + tests/libtest/lib503.c | 101 + tests/libtest/lib504.c | 113 + tests/libtest/lib505.c | 150 + tests/libtest/lib506.c | 380 + tests/libtest/lib507.c | 100 + tests/libtest/lib508.c | 108 + tests/libtest/lib509.c | 148 + tests/libtest/lib510.c | 135 + tests/libtest/lib511.c | 56 + tests/libtest/lib512.c | 74 + tests/libtest/lib513.c | 83 + tests/libtest/lib514.c | 79 + tests/libtest/lib515.c | 60 + tests/libtest/lib516.c | 59 + tests/libtest/lib517.c | 164 + tests/libtest/lib518.c | 521 ++ tests/libtest/lib519.c | 62 + tests/libtest/lib520.c | 55 + tests/libtest/lib521.c | 56 + tests/libtest/lib523.c | 57 + tests/libtest/lib524.c | 55 + tests/libtest/lib525.c | 162 + tests/libtest/lib526.c | 184 + tests/libtest/lib530.c | 122 + tests/libtest/lib533.c | 112 + tests/libtest/lib537.c | 523 ++ tests/libtest/lib539.c | 91 + tests/libtest/lib540.c | 246 + tests/libtest/lib541.c | 115 + tests/libtest/lib542.c | 73 + tests/libtest/lib543.c | 62 + tests/libtest/lib544.c | 95 + tests/libtest/lib547.c | 130 + tests/libtest/lib549.c | 65 + tests/libtest/lib552.c | 224 + tests/libtest/lib553.c | 115 + tests/libtest/lib554.c | 225 + tests/libtest/lib555.c | 163 + tests/libtest/lib556.c | 108 + tests/libtest/lib557.c | 1698 ++++ tests/libtest/lib558.c | 52 + tests/libtest/lib559.c | 55 + tests/libtest/lib560.c | 113 + tests/libtest/lib562.c | 74 + tests/libtest/lib564.c | 93 + tests/libtest/lib566.c | 67 + tests/libtest/lib567.c | 69 + tests/libtest/lib568.c | 177 + tests/libtest/lib569.c | 126 + tests/libtest/lib570.c | 115 + tests/libtest/lib571.c | 213 + tests/libtest/lib572.c | 183 + tests/libtest/lib573.c | 113 + tests/libtest/lib574.c | 71 + tests/libtest/lib575.c | 114 + tests/libtest/lib576.c | 125 + tests/libtest/lib578.c | 105 + tests/libtest/lib579.c | 161 + tests/libtest/lib582.c | 357 + tests/libtest/lib583.c | 84 + tests/libtest/lib586.c | 246 + tests/libtest/lib589.c | 59 + tests/libtest/lib590.c | 71 + tests/libtest/lib591.c | 145 + tests/libtest/lib597.c | 126 + tests/libtest/lib598.c | 72 + tests/libtest/lib599.c | 97 + tests/libtest/lib643.c | 304 + tests/libtest/lib650.c | 214 + tests/libtest/lib651.c | 94 + tests/libtest/lib652.c | 131 + tests/libtest/lib653.c | 63 + tests/libtest/lib654.c | 172 + tests/libtest/lib655.c | 112 + tests/libtest/lib658.c | 76 + tests/libtest/lib659.c | 75 + tests/libtest/lib661.c | 150 + tests/libtest/lib666.c | 120 + tests/libtest/lib667.c | 117 + tests/libtest/lib668.c | 122 + tests/libtest/lib670.c | 259 + tests/libtest/libauthretry.c | 147 + tests/libtest/libntlmconnect.c | 234 + tests/libtest/mk-lib1521.pl | 304 + tests/libtest/notexists.pl | 15 + tests/libtest/sethostname.c | 41 + tests/libtest/sethostname.h | 40 + tests/libtest/stub_gssapi.c | 449 + tests/libtest/stub_gssapi.h | 182 + tests/libtest/test.h | 488 ++ tests/libtest/test1013.pl | 51 + tests/libtest/test1022.pl | 54 + tests/libtest/test307.pl | 19 + tests/libtest/test610.pl | 33 + tests/libtest/test613.pl | 109 + tests/libtest/test75.pl | 13 + tests/libtest/testtrace.c | 144 + tests/libtest/testtrace.h | 36 + tests/libtest/testutil.c | 130 + tests/libtest/testutil.h | 44 + tests/manpage-scan.pl | 291 + tests/manpage-syntax.pl | 63 + tests/mem-include-scan.pl | 96 + tests/memanalyze.pl | 425 + tests/negtelnetserver.py | 340 + tests/nroff-scan.pl | 104 + tests/objnames-test08.sh | 217 + tests/objnames-test10.sh | 217 + tests/objnames.inc | 107 + tests/pathhelp.pm | 761 ++ tests/python_dependencies/impacket/LICENSE | 84 + .../python_dependencies/impacket/__init__.py | 25 + tests/python_dependencies/impacket/nmb.py | 982 +++ .../python_dependencies/impacket/nt_errors.py | 3586 ++++++++ tests/python_dependencies/impacket/ntlm.py | 973 +++ tests/python_dependencies/impacket/smb.py | 4099 +++++++++ tests/python_dependencies/impacket/smb3.py | 1630 ++++ .../impacket/smb3structs.py | 1363 +++ .../python_dependencies/impacket/smbserver.py | 4177 ++++++++++ tests/python_dependencies/impacket/spnego.py | 372 + .../python_dependencies/impacket/structure.py | 744 ++ tests/python_dependencies/impacket/uuid.py | 73 + tests/python_dependencies/impacket/version.py | 12 + tests/rtspserver.pl | 113 + tests/runtests.1 | 148 + tests/runtests.pl | 5709 +++++++++++++ tests/secureserver.pl | 361 + tests/server/.gitignore | 9 + tests/server/CMakeLists.txt | 59 + tests/server/Makefile.am | 70 + tests/server/Makefile.inc | 78 + tests/server/base64.pl | 9 + tests/server/disabled.c | 79 + tests/server/fake_ntlm.c | 285 + tests/server/getpart.c | 482 ++ tests/server/getpart.h | 34 + tests/server/resolve.c | 156 + tests/server/rtspd.c | 1483 ++++ tests/server/server_setup.h | 29 + tests/server/server_sockaddr.h | 41 + tests/server/sockfilt.c | 1565 ++++ tests/server/socksd.c | 1162 +++ tests/server/sws.c | 2412 ++++++ tests/server/testpart.c | 49 + tests/server/tftp.h | 61 + tests/server/tftpd.c | 1432 ++++ tests/server/util.c | 502 ++ tests/server/util.h | 69 + tests/serverhelp.pm | 246 + tests/smbserver.py | 382 + tests/sshhelp.pm | 473 ++ tests/sshserver.pl | 1126 +++ tests/stunnel.pem | 172 + tests/symbol-scan.pl | 180 + tests/testcurl.1 | 124 + tests/testcurl.pl | 814 ++ tests/tftpserver.pl | 114 + tests/unit/.gitignore | 1 + tests/unit/CMakeLists.txt | 56 + tests/unit/Makefile.am | 79 + tests/unit/Makefile.inc | 156 + tests/unit/README | 74 + tests/unit/curlcheck.h | 101 + tests/unit/unit1300.c | 221 + tests/unit/unit1301.c | 54 + tests/unit/unit1302.c | 165 + tests/unit/unit1303.c | 149 + tests/unit/unit1304.c | 210 + tests/unit/unit1305.c | 139 + tests/unit/unit1307.c | 323 + tests/unit/unit1308.c | 95 + tests/unit/unit1309.c | 142 + tests/unit/unit1323.c | 66 + tests/unit/unit1330.c | 41 + tests/unit/unit1394.c | 129 + tests/unit/unit1395.c | 94 + tests/unit/unit1396.c | 115 + tests/unit/unit1397.c | 79 + tests/unit/unit1398.c | 90 + tests/unit/unit1399.c | 117 + tests/unit/unit1600.c | 71 + tests/unit/unit1601.c | 56 + tests/unit/unit1602.c | 78 + tests/unit/unit1603.c | 150 + tests/unit/unit1604.c | 357 + tests/unit/unit1605.c | 55 + tests/unit/unit1606.c | 89 + tests/unit/unit1607.c | 219 + tests/unit/unit1608.c | 74 + tests/unit/unit1609.c | 218 + tests/unit/unit1610.c | 60 + tests/unit/unit1611.c | 58 + tests/unit/unit1612.c | 66 + tests/unit/unit1620.c | 92 + tests/unit/unit1621.c | 91 + tests/unit/unit1650.c | 294 + tests/unit/unit1651.c | 388 + tests/unit/unit1652.c | 133 + tests/unit/unit1653.c | 192 + tests/unit/unit1654.c | 135 + tests/unit/unit1655.c | 189 + tests/valgrind.pm | 34 + tests/valgrind.supp | 110 + winbuild/.gitignore | 2 + winbuild/BUILD.WINDOWS.txt | 130 + winbuild/Makefile.vc | 300 + winbuild/MakefileBuild.vc | 656 ++ winbuild/gen_resp_file.bat | 32 + winbuild/makedebug.cmd | 34 + winbuild/rundebug.cmd | 24 + 3228 files changed, 509250 insertions(+) create mode 100644 .azure-pipelines.yml create mode 100644 .cirrus.yml create mode 100644 .dir-locals.el create mode 100644 .gitattributes create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE create mode 100644 .github/lock.yml create mode 100644 .github/stale.yml create mode 100644 .github/workflows/cpp.yml create mode 100644 .github/workflows/fuzz.yml create mode 100644 .gitignore create mode 100644 .lgtm.yml create mode 100644 .mailmap create mode 100644 .travis.yml create mode 100644 CHANGES create mode 100644 CMake/CMakeConfigurableFile.in create mode 100644 CMake/CurlSymbolHiding.cmake create mode 100644 CMake/CurlTests.c create mode 100644 CMake/FindBearSSL.cmake create mode 100644 CMake/FindBrotli.cmake create mode 100644 CMake/FindCARES.cmake create mode 100644 CMake/FindGSS.cmake create mode 100644 CMake/FindLibSSH2.cmake create mode 100644 CMake/FindMbedTLS.cmake create mode 100644 CMake/FindNGHTTP2.cmake create mode 100644 CMake/FindNSS.cmake create mode 100644 CMake/Macros.cmake create mode 100644 CMake/OtherTests.cmake create mode 100644 CMake/Platforms/WindowsCache.cmake create mode 100644 CMake/Utilities.cmake create mode 100644 CMake/cmake_uninstall.cmake.in create mode 100644 CMake/curl-config.cmake.in create mode 100644 CMakeLists.txt create mode 100644 COPYING create mode 100644 GIT-INFO create mode 100755 MacOSX-Framework create mode 100644 Makefile.am create mode 100644 Makefile.dist create mode 100644 README create mode 100644 README.md create mode 100644 RELEASE-NOTES create mode 100644 SECURITY.md create mode 100644 acinclude.m4 create mode 100644 appveyor.yml create mode 100755 buildconf create mode 100644 buildconf.bat create mode 100755 configure.ac create mode 100644 curl-config.in create mode 100644 docs/.gitignore create mode 100644 docs/ALTSVC.md create mode 100644 docs/BINDINGS.md create mode 100644 docs/BUG-BOUNTY.md create mode 100644 docs/BUGS create mode 100644 docs/CHECKSRC.md create mode 100644 docs/CIPHERS.md create mode 100644 docs/CMakeLists.txt create mode 100644 docs/CODE_OF_CONDUCT.md create mode 100644 docs/CODE_STYLE.md create mode 100644 docs/CONTRIBUTE.md create mode 100644 docs/CURL-DISABLE.md create mode 100644 docs/DEPRECATE.md create mode 100644 docs/ESNI.md create mode 100644 docs/EXPERIMENTAL.md create mode 100644 docs/FAQ create mode 100644 docs/FEATURES create mode 100644 docs/GOVERNANCE.md create mode 100644 docs/HELP-US.md create mode 100644 docs/HISTORY.md create mode 100644 docs/HTTP-COOKIES.md create mode 100644 docs/HTTP2.md create mode 100644 docs/HTTP3.md create mode 100644 docs/INSTALL create mode 100644 docs/INSTALL.cmake create mode 100644 docs/INSTALL.md create mode 100644 docs/INTERNALS.md create mode 100644 docs/KNOWN_BUGS create mode 100644 docs/LICENSE-MIXING.md create mode 100644 docs/MAIL-ETIQUETTE create mode 100644 docs/MANUAL.md create mode 100644 docs/Makefile.am create mode 100644 docs/PARALLEL-TRANSFERS.md create mode 100644 docs/README.cmake create mode 100644 docs/README.md create mode 100644 docs/README.netware create mode 100644 docs/README.win32 create mode 100644 docs/RELEASE-PROCEDURE.md create mode 100644 docs/RESOURCES create mode 100644 docs/ROADMAP.md create mode 100644 docs/SECURITY-PROCESS.md create mode 100644 docs/SSL-PROBLEMS.md create mode 100644 docs/SSLCERTS.md create mode 100644 docs/THANKS create mode 100644 docs/THANKS-filter create mode 100644 docs/TODO create mode 100644 docs/TheArtOfHttpScripting create mode 100644 docs/VERSIONS create mode 100644 docs/cmdline-opts/CMakeLists.txt create mode 100644 docs/cmdline-opts/MANPAGE.md create mode 100644 docs/cmdline-opts/Makefile.am create mode 100644 docs/cmdline-opts/Makefile.inc create mode 100644 docs/cmdline-opts/abstract-unix-socket.d create mode 100644 docs/cmdline-opts/alt-svc.d create mode 100644 docs/cmdline-opts/anyauth.d create mode 100644 docs/cmdline-opts/append.d create mode 100644 docs/cmdline-opts/basic.d create mode 100644 docs/cmdline-opts/cacert.d create mode 100644 docs/cmdline-opts/capath.d create mode 100644 docs/cmdline-opts/cert-status.d create mode 100644 docs/cmdline-opts/cert-type.d create mode 100644 docs/cmdline-opts/cert.d create mode 100644 docs/cmdline-opts/ciphers.d create mode 100644 docs/cmdline-opts/compressed-ssh.d create mode 100644 docs/cmdline-opts/compressed.d create mode 100644 docs/cmdline-opts/config.d create mode 100644 docs/cmdline-opts/connect-timeout.d create mode 100644 docs/cmdline-opts/connect-to.d create mode 100644 docs/cmdline-opts/continue-at.d create mode 100644 docs/cmdline-opts/cookie-jar.d create mode 100644 docs/cmdline-opts/cookie.d create mode 100644 docs/cmdline-opts/create-dirs.d create mode 100644 docs/cmdline-opts/crlf.d create mode 100644 docs/cmdline-opts/crlfile.d create mode 100644 docs/cmdline-opts/data-ascii.d create mode 100644 docs/cmdline-opts/data-binary.d create mode 100644 docs/cmdline-opts/data-raw.d create mode 100644 docs/cmdline-opts/data-urlencode.d create mode 100644 docs/cmdline-opts/data.d create mode 100644 docs/cmdline-opts/delegation.d create mode 100644 docs/cmdline-opts/digest.d create mode 100644 docs/cmdline-opts/disable-eprt.d create mode 100644 docs/cmdline-opts/disable-epsv.d create mode 100644 docs/cmdline-opts/disable.d create mode 100644 docs/cmdline-opts/disallow-username-in-url.d create mode 100644 docs/cmdline-opts/dns-interface.d create mode 100644 docs/cmdline-opts/dns-ipv4-addr.d create mode 100644 docs/cmdline-opts/dns-ipv6-addr.d create mode 100644 docs/cmdline-opts/dns-servers.d create mode 100644 docs/cmdline-opts/doh-url.d create mode 100644 docs/cmdline-opts/dump-header.d create mode 100644 docs/cmdline-opts/egd-file.d create mode 100644 docs/cmdline-opts/engine.d create mode 100644 docs/cmdline-opts/etag-compare.d create mode 100644 docs/cmdline-opts/etag-save.d create mode 100644 docs/cmdline-opts/expect100-timeout.d create mode 100644 docs/cmdline-opts/fail-early.d create mode 100644 docs/cmdline-opts/fail.d create mode 100644 docs/cmdline-opts/false-start.d create mode 100644 docs/cmdline-opts/form-string.d create mode 100644 docs/cmdline-opts/form.d create mode 100644 docs/cmdline-opts/ftp-account.d create mode 100644 docs/cmdline-opts/ftp-alternative-to-user.d create mode 100644 docs/cmdline-opts/ftp-create-dirs.d create mode 100644 docs/cmdline-opts/ftp-method.d create mode 100644 docs/cmdline-opts/ftp-pasv.d create mode 100644 docs/cmdline-opts/ftp-port.d create mode 100644 docs/cmdline-opts/ftp-pret.d create mode 100644 docs/cmdline-opts/ftp-skip-pasv-ip.d create mode 100644 docs/cmdline-opts/ftp-ssl-ccc-mode.d create mode 100644 docs/cmdline-opts/ftp-ssl-ccc.d create mode 100644 docs/cmdline-opts/ftp-ssl-control.d create mode 100755 docs/cmdline-opts/gen.pl create mode 100644 docs/cmdline-opts/get.d create mode 100644 docs/cmdline-opts/globoff.d create mode 100644 docs/cmdline-opts/happy-eyeballs-timeout-ms.d create mode 100644 docs/cmdline-opts/haproxy-protocol.d create mode 100644 docs/cmdline-opts/head.d create mode 100644 docs/cmdline-opts/header.d create mode 100644 docs/cmdline-opts/help.d create mode 100644 docs/cmdline-opts/hostpubmd5.d create mode 100644 docs/cmdline-opts/http0.9.d create mode 100644 docs/cmdline-opts/http1.0.d create mode 100644 docs/cmdline-opts/http1.1.d create mode 100644 docs/cmdline-opts/http2-prior-knowledge.d create mode 100644 docs/cmdline-opts/http2.d create mode 100644 docs/cmdline-opts/http3.d create mode 100644 docs/cmdline-opts/ignore-content-length.d create mode 100644 docs/cmdline-opts/include.d create mode 100644 docs/cmdline-opts/insecure.d create mode 100644 docs/cmdline-opts/interface.d create mode 100644 docs/cmdline-opts/ipv4.d create mode 100644 docs/cmdline-opts/ipv6.d create mode 100644 docs/cmdline-opts/junk-session-cookies.d create mode 100644 docs/cmdline-opts/keepalive-time.d create mode 100644 docs/cmdline-opts/key-type.d create mode 100644 docs/cmdline-opts/key.d create mode 100644 docs/cmdline-opts/krb.d create mode 100644 docs/cmdline-opts/libcurl.d create mode 100644 docs/cmdline-opts/limit-rate.d create mode 100644 docs/cmdline-opts/list-only.d create mode 100644 docs/cmdline-opts/local-port.d create mode 100644 docs/cmdline-opts/location-trusted.d create mode 100644 docs/cmdline-opts/location.d create mode 100644 docs/cmdline-opts/login-options.d create mode 100644 docs/cmdline-opts/mail-auth.d create mode 100644 docs/cmdline-opts/mail-from.d create mode 100644 docs/cmdline-opts/mail-rcpt-allowfails.d create mode 100644 docs/cmdline-opts/mail-rcpt.d create mode 100644 docs/cmdline-opts/manual.d create mode 100644 docs/cmdline-opts/max-filesize.d create mode 100644 docs/cmdline-opts/max-redirs.d create mode 100644 docs/cmdline-opts/max-time.d create mode 100644 docs/cmdline-opts/metalink.d create mode 100644 docs/cmdline-opts/negotiate.d create mode 100644 docs/cmdline-opts/netrc-file.d create mode 100644 docs/cmdline-opts/netrc-optional.d create mode 100644 docs/cmdline-opts/netrc.d create mode 100644 docs/cmdline-opts/next.d create mode 100644 docs/cmdline-opts/no-alpn.d create mode 100644 docs/cmdline-opts/no-buffer.d create mode 100644 docs/cmdline-opts/no-keepalive.d create mode 100644 docs/cmdline-opts/no-npn.d create mode 100644 docs/cmdline-opts/no-progress-meter.d create mode 100644 docs/cmdline-opts/no-sessionid.d create mode 100644 docs/cmdline-opts/noproxy.d create mode 100644 docs/cmdline-opts/ntlm-wb.d create mode 100644 docs/cmdline-opts/ntlm.d create mode 100644 docs/cmdline-opts/oauth2-bearer.d create mode 100644 docs/cmdline-opts/output.d create mode 100644 docs/cmdline-opts/page-footer create mode 100644 docs/cmdline-opts/page-header create mode 100644 docs/cmdline-opts/parallel-immediate.d create mode 100644 docs/cmdline-opts/parallel-max.d create mode 100644 docs/cmdline-opts/parallel.d create mode 100644 docs/cmdline-opts/pass.d create mode 100644 docs/cmdline-opts/path-as-is.d create mode 100644 docs/cmdline-opts/pinnedpubkey.d create mode 100644 docs/cmdline-opts/post301.d create mode 100644 docs/cmdline-opts/post302.d create mode 100644 docs/cmdline-opts/post303.d create mode 100644 docs/cmdline-opts/preproxy.d create mode 100644 docs/cmdline-opts/progress-bar.d create mode 100644 docs/cmdline-opts/proto-default.d create mode 100644 docs/cmdline-opts/proto-redir.d create mode 100644 docs/cmdline-opts/proto.d create mode 100644 docs/cmdline-opts/proxy-anyauth.d create mode 100644 docs/cmdline-opts/proxy-basic.d create mode 100644 docs/cmdline-opts/proxy-cacert.d create mode 100644 docs/cmdline-opts/proxy-capath.d create mode 100644 docs/cmdline-opts/proxy-cert-type.d create mode 100644 docs/cmdline-opts/proxy-cert.d create mode 100644 docs/cmdline-opts/proxy-ciphers.d create mode 100644 docs/cmdline-opts/proxy-crlfile.d create mode 100644 docs/cmdline-opts/proxy-digest.d create mode 100644 docs/cmdline-opts/proxy-header.d create mode 100644 docs/cmdline-opts/proxy-insecure.d create mode 100644 docs/cmdline-opts/proxy-key-type.d create mode 100644 docs/cmdline-opts/proxy-key.d create mode 100644 docs/cmdline-opts/proxy-negotiate.d create mode 100644 docs/cmdline-opts/proxy-ntlm.d create mode 100644 docs/cmdline-opts/proxy-pass.d create mode 100644 docs/cmdline-opts/proxy-pinnedpubkey.d create mode 100644 docs/cmdline-opts/proxy-service-name.d create mode 100644 docs/cmdline-opts/proxy-ssl-allow-beast.d create mode 100644 docs/cmdline-opts/proxy-tls13-ciphers.d create mode 100644 docs/cmdline-opts/proxy-tlsauthtype.d create mode 100644 docs/cmdline-opts/proxy-tlspassword.d create mode 100644 docs/cmdline-opts/proxy-tlsuser.d create mode 100644 docs/cmdline-opts/proxy-tlsv1.d create mode 100644 docs/cmdline-opts/proxy-user.d create mode 100644 docs/cmdline-opts/proxy.d create mode 100644 docs/cmdline-opts/proxy1.0.d create mode 100644 docs/cmdline-opts/proxytunnel.d create mode 100644 docs/cmdline-opts/pubkey.d create mode 100644 docs/cmdline-opts/quote.d create mode 100644 docs/cmdline-opts/random-file.d create mode 100644 docs/cmdline-opts/range.d create mode 100644 docs/cmdline-opts/raw.d create mode 100644 docs/cmdline-opts/referer.d create mode 100644 docs/cmdline-opts/remote-header-name.d create mode 100644 docs/cmdline-opts/remote-name-all.d create mode 100644 docs/cmdline-opts/remote-name.d create mode 100644 docs/cmdline-opts/remote-time.d create mode 100644 docs/cmdline-opts/request-target.d create mode 100644 docs/cmdline-opts/request.d create mode 100644 docs/cmdline-opts/resolve.d create mode 100644 docs/cmdline-opts/retry-connrefused.d create mode 100644 docs/cmdline-opts/retry-delay.d create mode 100644 docs/cmdline-opts/retry-max-time.d create mode 100644 docs/cmdline-opts/retry.d create mode 100644 docs/cmdline-opts/sasl-authzid.d create mode 100644 docs/cmdline-opts/sasl-ir.d create mode 100644 docs/cmdline-opts/service-name.d create mode 100644 docs/cmdline-opts/show-error.d create mode 100644 docs/cmdline-opts/silent.d create mode 100644 docs/cmdline-opts/socks4.d create mode 100644 docs/cmdline-opts/socks4a.d create mode 100644 docs/cmdline-opts/socks5-basic.d create mode 100644 docs/cmdline-opts/socks5-gssapi-nec.d create mode 100644 docs/cmdline-opts/socks5-gssapi-service.d create mode 100644 docs/cmdline-opts/socks5-gssapi.d create mode 100644 docs/cmdline-opts/socks5-hostname.d create mode 100644 docs/cmdline-opts/socks5.d create mode 100644 docs/cmdline-opts/speed-limit.d create mode 100644 docs/cmdline-opts/speed-time.d create mode 100644 docs/cmdline-opts/ssl-allow-beast.d create mode 100644 docs/cmdline-opts/ssl-no-revoke.d create mode 100644 docs/cmdline-opts/ssl-reqd.d create mode 100644 docs/cmdline-opts/ssl.d create mode 100644 docs/cmdline-opts/sslv2.d create mode 100644 docs/cmdline-opts/sslv3.d create mode 100644 docs/cmdline-opts/stderr.d create mode 100644 docs/cmdline-opts/styled-output.d create mode 100644 docs/cmdline-opts/suppress-connect-headers.d create mode 100644 docs/cmdline-opts/tcp-fastopen.d create mode 100644 docs/cmdline-opts/tcp-nodelay.d create mode 100644 docs/cmdline-opts/telnet-option.d create mode 100644 docs/cmdline-opts/tftp-blksize.d create mode 100644 docs/cmdline-opts/tftp-no-options.d create mode 100644 docs/cmdline-opts/time-cond.d create mode 100644 docs/cmdline-opts/tls-max.d create mode 100644 docs/cmdline-opts/tls13-ciphers.d create mode 100644 docs/cmdline-opts/tlsauthtype.d create mode 100644 docs/cmdline-opts/tlspassword.d create mode 100644 docs/cmdline-opts/tlsuser.d create mode 100644 docs/cmdline-opts/tlsv1.0.d create mode 100644 docs/cmdline-opts/tlsv1.1.d create mode 100644 docs/cmdline-opts/tlsv1.2.d create mode 100644 docs/cmdline-opts/tlsv1.3.d create mode 100644 docs/cmdline-opts/tlsv1.d create mode 100644 docs/cmdline-opts/tr-encoding.d create mode 100644 docs/cmdline-opts/trace-ascii.d create mode 100644 docs/cmdline-opts/trace-time.d create mode 100644 docs/cmdline-opts/trace.d create mode 100644 docs/cmdline-opts/unix-socket.d create mode 100644 docs/cmdline-opts/upload-file.d create mode 100644 docs/cmdline-opts/url.d create mode 100644 docs/cmdline-opts/use-ascii.d create mode 100644 docs/cmdline-opts/user-agent.d create mode 100644 docs/cmdline-opts/user.d create mode 100644 docs/cmdline-opts/verbose.d create mode 100644 docs/cmdline-opts/version.d create mode 100644 docs/cmdline-opts/write-out.d create mode 100644 docs/cmdline-opts/xattr.d create mode 100644 docs/curl-config.1 create mode 100644 docs/examples/.gitignore create mode 100644 docs/examples/10-at-a-time.c create mode 100644 docs/examples/Makefile.am create mode 100644 docs/examples/Makefile.example create mode 100644 docs/examples/Makefile.inc create mode 100644 docs/examples/Makefile.m32 create mode 100644 docs/examples/Makefile.netware create mode 100644 docs/examples/README create mode 100755 docs/examples/adddocsref.pl create mode 100644 docs/examples/altsvc.c create mode 100644 docs/examples/anyauthput.c create mode 100644 docs/examples/asiohiper.cpp create mode 100644 docs/examples/cacertinmem.c create mode 100644 docs/examples/certinfo.c create mode 100644 docs/examples/chkspeed.c create mode 100644 docs/examples/cookie_interface.c create mode 100644 docs/examples/crawler.c create mode 100644 docs/examples/curlgtk.c create mode 100644 docs/examples/curlx.c create mode 100644 docs/examples/debug.c create mode 100644 docs/examples/ephiperfifo.c create mode 100644 docs/examples/evhiperfifo.c create mode 100644 docs/examples/externalsocket.c create mode 100644 docs/examples/fileupload.c create mode 100644 docs/examples/fopen.c create mode 100644 docs/examples/ftp-wildcard.c create mode 100644 docs/examples/ftpget.c create mode 100644 docs/examples/ftpgetinfo.c create mode 100644 docs/examples/ftpgetresp.c create mode 100644 docs/examples/ftpsget.c create mode 100644 docs/examples/ftpupload.c create mode 100644 docs/examples/ftpuploadfrommem.c create mode 100644 docs/examples/ftpuploadresume.c create mode 100644 docs/examples/getinfo.c create mode 100644 docs/examples/getinmemory.c create mode 100644 docs/examples/getredirect.c create mode 100644 docs/examples/ghiper.c create mode 100644 docs/examples/hiperfifo.c create mode 100644 docs/examples/href_extractor.c create mode 100644 docs/examples/htmltidy.c create mode 100644 docs/examples/htmltitle.cpp create mode 100644 docs/examples/http-post.c create mode 100644 docs/examples/http2-download.c create mode 100644 docs/examples/http2-pushinmemory.c create mode 100644 docs/examples/http2-serverpush.c create mode 100644 docs/examples/http2-upload.c create mode 100644 docs/examples/http3-present.c create mode 100644 docs/examples/http3.c create mode 100644 docs/examples/httpcustomheader.c create mode 100644 docs/examples/httpput.c create mode 100644 docs/examples/https.c create mode 100644 docs/examples/imap-append.c create mode 100644 docs/examples/imap-authzid.c create mode 100644 docs/examples/imap-copy.c create mode 100644 docs/examples/imap-create.c create mode 100644 docs/examples/imap-delete.c create mode 100644 docs/examples/imap-examine.c create mode 100644 docs/examples/imap-fetch.c create mode 100644 docs/examples/imap-list.c create mode 100644 docs/examples/imap-lsub.c create mode 100644 docs/examples/imap-multi.c create mode 100644 docs/examples/imap-noop.c create mode 100644 docs/examples/imap-search.c create mode 100644 docs/examples/imap-ssl.c create mode 100644 docs/examples/imap-store.c create mode 100644 docs/examples/imap-tls.c create mode 100644 docs/examples/makefile.dj create mode 100644 docs/examples/multi-app.c create mode 100644 docs/examples/multi-debugcallback.c create mode 100644 docs/examples/multi-double.c create mode 100644 docs/examples/multi-event.c create mode 100644 docs/examples/multi-formadd.c create mode 100644 docs/examples/multi-poll.c create mode 100644 docs/examples/multi-post.c create mode 100644 docs/examples/multi-single.c create mode 100644 docs/examples/multi-uv.c create mode 100644 docs/examples/multithread.c create mode 100644 docs/examples/opensslthreadlock.c create mode 100644 docs/examples/parseurl.c create mode 100644 docs/examples/persistent.c create mode 100644 docs/examples/pop3-authzid.c create mode 100644 docs/examples/pop3-dele.c create mode 100644 docs/examples/pop3-list.c create mode 100644 docs/examples/pop3-multi.c create mode 100644 docs/examples/pop3-noop.c create mode 100644 docs/examples/pop3-retr.c create mode 100644 docs/examples/pop3-ssl.c create mode 100644 docs/examples/pop3-stat.c create mode 100644 docs/examples/pop3-tls.c create mode 100644 docs/examples/pop3-top.c create mode 100644 docs/examples/pop3-uidl.c create mode 100644 docs/examples/post-callback.c create mode 100644 docs/examples/postinmemory.c create mode 100644 docs/examples/postit2-formadd.c create mode 100644 docs/examples/postit2.c create mode 100644 docs/examples/progressfunc.c create mode 100644 docs/examples/resolve.c create mode 100644 docs/examples/rtsp.c create mode 100644 docs/examples/sampleconv.c create mode 100644 docs/examples/sendrecv.c create mode 100644 docs/examples/sepheaders.c create mode 100644 docs/examples/sessioninfo.c create mode 100644 docs/examples/sftpget.c create mode 100644 docs/examples/sftpuploadresume.c create mode 100644 docs/examples/shared-connection-cache.c create mode 100644 docs/examples/simple.c create mode 100644 docs/examples/simplepost.c create mode 100644 docs/examples/simplessl.c create mode 100644 docs/examples/smooth-gtk-thread.c create mode 100644 docs/examples/smtp-authzid.c create mode 100644 docs/examples/smtp-expn.c create mode 100644 docs/examples/smtp-mail.c create mode 100644 docs/examples/smtp-mime.c create mode 100644 docs/examples/smtp-multi.c create mode 100644 docs/examples/smtp-ssl.c create mode 100644 docs/examples/smtp-tls.c create mode 100644 docs/examples/smtp-vrfy.c create mode 100644 docs/examples/sslbackend.c create mode 100644 docs/examples/synctime.c create mode 100644 docs/examples/threaded-shared-conn.c create mode 100644 docs/examples/threaded-ssl.c create mode 100644 docs/examples/url2file.c create mode 100644 docs/examples/urlapi.c create mode 100644 docs/examples/usercertinmem.c create mode 100755 docs/examples/version-check.pl create mode 100644 docs/examples/xmlstream.c create mode 100644 docs/libcurl/.gitignore create mode 100644 docs/libcurl/ABI create mode 100644 docs/libcurl/CMakeLists.txt create mode 100644 docs/libcurl/Makefile.am create mode 100644 docs/libcurl/Makefile.inc create mode 100644 docs/libcurl/curl_easy_cleanup.3 create mode 100644 docs/libcurl/curl_easy_duphandle.3 create mode 100644 docs/libcurl/curl_easy_escape.3 create mode 100644 docs/libcurl/curl_easy_getinfo.3 create mode 100644 docs/libcurl/curl_easy_init.3 create mode 100644 docs/libcurl/curl_easy_pause.3 create mode 100644 docs/libcurl/curl_easy_perform.3 create mode 100644 docs/libcurl/curl_easy_recv.3 create mode 100644 docs/libcurl/curl_easy_reset.3 create mode 100644 docs/libcurl/curl_easy_send.3 create mode 100644 docs/libcurl/curl_easy_setopt.3 create mode 100644 docs/libcurl/curl_easy_strerror.3 create mode 100644 docs/libcurl/curl_easy_unescape.3 create mode 100644 docs/libcurl/curl_easy_upkeep.3 create mode 100644 docs/libcurl/curl_escape.3 create mode 100644 docs/libcurl/curl_formadd.3 create mode 100644 docs/libcurl/curl_formfree.3 create mode 100644 docs/libcurl/curl_formget.3 create mode 100644 docs/libcurl/curl_free.3 create mode 100644 docs/libcurl/curl_getdate.3 create mode 100644 docs/libcurl/curl_getenv.3 create mode 100644 docs/libcurl/curl_global_cleanup.3 create mode 100644 docs/libcurl/curl_global_init.3 create mode 100644 docs/libcurl/curl_global_init_mem.3 create mode 100644 docs/libcurl/curl_global_sslset.3 create mode 100644 docs/libcurl/curl_mime_addpart.3 create mode 100644 docs/libcurl/curl_mime_data.3 create mode 100644 docs/libcurl/curl_mime_data_cb.3 create mode 100644 docs/libcurl/curl_mime_encoder.3 create mode 100644 docs/libcurl/curl_mime_filedata.3 create mode 100644 docs/libcurl/curl_mime_filename.3 create mode 100644 docs/libcurl/curl_mime_free.3 create mode 100644 docs/libcurl/curl_mime_headers.3 create mode 100644 docs/libcurl/curl_mime_init.3 create mode 100644 docs/libcurl/curl_mime_name.3 create mode 100644 docs/libcurl/curl_mime_subparts.3 create mode 100644 docs/libcurl/curl_mime_type.3 create mode 100644 docs/libcurl/curl_mprintf.3 create mode 100644 docs/libcurl/curl_multi_add_handle.3 create mode 100644 docs/libcurl/curl_multi_assign.3 create mode 100644 docs/libcurl/curl_multi_cleanup.3 create mode 100644 docs/libcurl/curl_multi_fdset.3 create mode 100644 docs/libcurl/curl_multi_info_read.3 create mode 100644 docs/libcurl/curl_multi_init.3 create mode 100644 docs/libcurl/curl_multi_perform.3 create mode 100644 docs/libcurl/curl_multi_poll.3 create mode 100644 docs/libcurl/curl_multi_remove_handle.3 create mode 100644 docs/libcurl/curl_multi_setopt.3 create mode 100644 docs/libcurl/curl_multi_socket.3 create mode 100644 docs/libcurl/curl_multi_socket_action.3 create mode 100644 docs/libcurl/curl_multi_socket_all.3 create mode 100644 docs/libcurl/curl_multi_strerror.3 create mode 100644 docs/libcurl/curl_multi_timeout.3 create mode 100644 docs/libcurl/curl_multi_wait.3 create mode 100644 docs/libcurl/curl_multi_wakeup.3 create mode 100644 docs/libcurl/curl_share_cleanup.3 create mode 100644 docs/libcurl/curl_share_init.3 create mode 100644 docs/libcurl/curl_share_setopt.3 create mode 100644 docs/libcurl/curl_share_strerror.3 create mode 100644 docs/libcurl/curl_slist_append.3 create mode 100644 docs/libcurl/curl_slist_free_all.3 create mode 100644 docs/libcurl/curl_strequal.3 create mode 100644 docs/libcurl/curl_strnequal.3 create mode 100644 docs/libcurl/curl_unescape.3 create mode 100644 docs/libcurl/curl_url.3 create mode 100644 docs/libcurl/curl_url_cleanup.3 create mode 100644 docs/libcurl/curl_url_dup.3 create mode 100644 docs/libcurl/curl_url_get.3 create mode 100644 docs/libcurl/curl_url_set.3 create mode 100644 docs/libcurl/curl_version.3 create mode 100644 docs/libcurl/curl_version_info.3 create mode 100644 docs/libcurl/getinfo-times create mode 100644 docs/libcurl/libcurl-easy.3 create mode 100644 docs/libcurl/libcurl-env.3 create mode 100644 docs/libcurl/libcurl-errors.3 create mode 100644 docs/libcurl/libcurl-multi.3 create mode 100644 docs/libcurl/libcurl-security.3 create mode 100644 docs/libcurl/libcurl-share.3 create mode 100644 docs/libcurl/libcurl-thread.3 create mode 100644 docs/libcurl/libcurl-tutorial.3 create mode 100644 docs/libcurl/libcurl-url.3 create mode 100644 docs/libcurl/libcurl.3 create mode 100644 docs/libcurl/libcurl.m4 create mode 100755 docs/libcurl/mksymbolsmanpage.pl create mode 100644 docs/libcurl/opts/CMakeLists.txt create mode 100644 docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 create mode 100644 docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_CERTINFO.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 create mode 100644 docs/libcurl/opts/CURLINFO_COOKIELIST.3 create mode 100644 docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 create mode 100644 docs/libcurl/opts/CURLINFO_FILETIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_FILETIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 create mode 100644 docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 create mode 100644 docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 create mode 100644 docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 create mode 100644 docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 create mode 100644 docs/libcurl/opts/CURLINFO_LASTSOCKET.3 create mode 100644 docs/libcurl/opts/CURLINFO_LOCAL_IP.3 create mode 100644 docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 create mode 100644 docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 create mode 100644 docs/libcurl/opts/CURLINFO_OS_ERRNO.3 create mode 100644 docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 create mode 100644 docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 create mode 100644 docs/libcurl/opts/CURLINFO_PRIVATE.3 create mode 100644 docs/libcurl/opts/CURLINFO_PROTOCOL.3 create mode 100644 docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 create mode 100644 docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 create mode 100644 docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 create mode 100644 docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 create mode 100644 docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 create mode 100644 docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 create mode 100644 docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 create mode 100644 docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 create mode 100644 docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 create mode 100644 docs/libcurl/opts/CURLINFO_SCHEME.3 create mode 100644 docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 create mode 100644 docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 create mode 100644 docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 create mode 100644 docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLINFO_TLS_SESSION.3 create mode 100644 docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 create mode 100644 docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 create mode 100644 docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3 create mode 100644 docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 create mode 100644 docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PUSHDATA.3 create mode 100644 docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERDATA.3 create mode 100644 docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_ALTSVC.3 create mode 100644 docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 create mode 100644 docs/libcurl/opts/CURLOPT_APPEND.3 create mode 100644 docs/libcurl/opts/CURLOPT_AUTOREFERER.3 create mode 100644 docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_CAINFO.3 create mode 100644 docs/libcurl/opts/CURLOPT_CAPATH.3 create mode 100644 docs/libcurl/opts/CURLOPT_CERTINFO.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONNECT_TO.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIE.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIEJAR.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIELIST.3 create mode 100644 docs/libcurl/opts/CURLOPT_COOKIESESSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 create mode 100644 docs/libcurl/opts/CURLOPT_CRLF.3 create mode 100644 docs/libcurl/opts/CURLOPT_CRLFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_CURLU.3 create mode 100644 docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 create mode 100644 docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 create mode 100644 docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 create mode 100644 docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 create mode 100644 docs/libcurl/opts/CURLOPT_DOH_URL.3 create mode 100644 docs/libcurl/opts/CURLOPT_EGDSOCKET.3 create mode 100644 docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 create mode 100644 docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_FAILONERROR.3 create mode 100644 docs/libcurl/opts/CURLOPT_FILETIME.3 create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 create mode 100644 docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 create mode 100644 docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTPPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 create mode 100644 docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 create mode 100644 docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 create mode 100644 docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADERDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_HEADEROPT.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPGET.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPHEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERFACE.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_IPRESOLVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_ISSUERCERT.3 create mode 100644 docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 create mode 100644 docs/libcurl/opts/CURLOPT_KEYPASSWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_KRBLEVEL.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 create mode 100644 docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_FROM.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAXREDIRS.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_MIMEPOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_NETRC.3 create mode 100644 docs/libcurl/opts/CURLOPT_NETRC_FILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOBODY.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOPROGRESS.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOPROXY.3 create mode 100644 docs/libcurl/opts/CURLOPT_NOSIGNAL.3 create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_PASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 create mode 100644 docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PIPEWAIT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_POST.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDS.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTQUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_POSTREDIR.3 create mode 100644 docs/libcurl/opts/CURLOPT_PREQUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PRE_PROXY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PRIVATE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROTOCOLS.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYAUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYHEADER.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 create mode 100644 docs/libcurl/opts/CURLOPT_PUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_QUOTE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RANGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_READDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_READFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 create mode 100644 docs/libcurl/opts/CURLOPT_REFERER.3 create mode 100644 docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM.3 create mode 100644 docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 create mode 100644 docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 create mode 100644 docs/libcurl/opts/CURLOPT_SASL_IR.3 create mode 100644 docs/libcurl/opts/CURLOPT_SEEKDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_SHARE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 create mode 100644 docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEY.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSLVERSION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 create mode 100644 docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 create mode 100644 docs/libcurl/opts/CURLOPT_STDERR.3 create mode 100644 docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 create mode 100644 docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 create mode 100644 docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 create mode 100644 docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 create mode 100644 docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 create mode 100644 docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMECONDITION.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEVALUE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 create mode 100644 docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRAILERDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 create mode 100644 docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 create mode 100644 docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 create mode 100644 docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 create mode 100644 docs/libcurl/opts/CURLOPT_UPKEEP_INTERVAL_MS.3 create mode 100644 docs/libcurl/opts/CURLOPT_UPLOAD.3 create mode 100644 docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3 create mode 100644 docs/libcurl/opts/CURLOPT_URL.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERAGENT.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERNAME.3 create mode 100644 docs/libcurl/opts/CURLOPT_USERPWD.3 create mode 100644 docs/libcurl/opts/CURLOPT_USE_SSL.3 create mode 100644 docs/libcurl/opts/CURLOPT_VERBOSE.3 create mode 100644 docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 create mode 100644 docs/libcurl/opts/CURLOPT_WRITEDATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFODATA.3 create mode 100644 docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 create mode 100644 docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 create mode 100644 docs/libcurl/opts/Makefile.am create mode 100644 docs/libcurl/opts/Makefile.inc create mode 100644 docs/libcurl/opts/template.3 create mode 100644 docs/libcurl/symbols-in-versions create mode 100755 docs/libcurl/symbols.pl create mode 100644 docs/mk-ca-bundle.1 create mode 100644 include/Makefile.am create mode 100644 include/README create mode 100644 include/curl/.gitignore create mode 100644 include/curl/Makefile.am create mode 100644 include/curl/curl.h create mode 100644 include/curl/curlver.h create mode 100644 include/curl/easy.h create mode 100644 include/curl/mprintf.h create mode 100644 include/curl/multi.h create mode 100644 include/curl/stdcheaders.h create mode 100644 include/curl/system.h create mode 100644 include/curl/typecheck-gcc.h create mode 100644 include/curl/urlapi.h create mode 100644 lib/.gitattributes create mode 100644 lib/.gitignore create mode 100644 lib/CMakeLists.txt create mode 100644 lib/Makefile.Watcom create mode 100644 lib/Makefile.am create mode 100644 lib/Makefile.inc create mode 100644 lib/Makefile.m32 create mode 100644 lib/Makefile.netware create mode 100644 lib/Makefile.vxworks create mode 100644 lib/altsvc.c create mode 100644 lib/altsvc.h create mode 100644 lib/amigaos.c create mode 100644 lib/amigaos.h create mode 100644 lib/arpa_telnet.h create mode 100644 lib/asyn-ares.c create mode 100644 lib/asyn-thread.c create mode 100644 lib/asyn.h create mode 100644 lib/base64.c create mode 100755 lib/checksrc.pl create mode 100644 lib/config-amigaos.h create mode 100644 lib/config-dos.h create mode 100644 lib/config-mac.h create mode 100644 lib/config-os400.h create mode 100644 lib/config-plan9.h create mode 100644 lib/config-riscos.h create mode 100644 lib/config-symbian.h create mode 100644 lib/config-tpf.h create mode 100644 lib/config-vxworks.h create mode 100644 lib/config-win32.h create mode 100644 lib/config-win32ce.h create mode 100644 lib/conncache.c create mode 100644 lib/conncache.h create mode 100644 lib/connect.c create mode 100644 lib/connect.h create mode 100644 lib/content_encoding.c create mode 100644 lib/content_encoding.h create mode 100644 lib/cookie.c create mode 100644 lib/cookie.h create mode 100644 lib/curl_addrinfo.c create mode 100644 lib/curl_addrinfo.h create mode 100644 lib/curl_base64.h create mode 100644 lib/curl_config.h.cmake create mode 100644 lib/curl_ctype.c create mode 100644 lib/curl_ctype.h create mode 100644 lib/curl_des.c create mode 100644 lib/curl_des.h create mode 100644 lib/curl_endian.c create mode 100644 lib/curl_endian.h create mode 100644 lib/curl_fnmatch.c create mode 100644 lib/curl_fnmatch.h create mode 100644 lib/curl_get_line.c create mode 100644 lib/curl_get_line.h create mode 100644 lib/curl_gethostname.c create mode 100644 lib/curl_gethostname.h create mode 100644 lib/curl_gssapi.c create mode 100644 lib/curl_gssapi.h create mode 100644 lib/curl_hmac.h create mode 100644 lib/curl_ldap.h create mode 100644 lib/curl_md4.h create mode 100644 lib/curl_md5.h create mode 100644 lib/curl_memory.h create mode 100644 lib/curl_memrchr.c create mode 100644 lib/curl_memrchr.h create mode 100644 lib/curl_multibyte.c create mode 100644 lib/curl_multibyte.h create mode 100644 lib/curl_ntlm_core.c create mode 100644 lib/curl_ntlm_core.h create mode 100644 lib/curl_ntlm_wb.c create mode 100644 lib/curl_ntlm_wb.h create mode 100644 lib/curl_path.c create mode 100644 lib/curl_path.h create mode 100644 lib/curl_printf.h create mode 100644 lib/curl_range.c create mode 100644 lib/curl_range.h create mode 100644 lib/curl_rtmp.c create mode 100644 lib/curl_rtmp.h create mode 100644 lib/curl_sasl.c create mode 100644 lib/curl_sasl.h create mode 100644 lib/curl_sec.h create mode 100644 lib/curl_setup.h create mode 100644 lib/curl_setup_once.h create mode 100644 lib/curl_sha256.h create mode 100644 lib/curl_sspi.c create mode 100644 lib/curl_sspi.h create mode 100644 lib/curl_threads.c create mode 100644 lib/curl_threads.h create mode 100644 lib/curlx.h create mode 100644 lib/dict.c create mode 100644 lib/dict.h create mode 100644 lib/doh.c create mode 100644 lib/doh.h create mode 100644 lib/dotdot.c create mode 100644 lib/dotdot.h create mode 100644 lib/easy.c create mode 100644 lib/easyif.h create mode 100644 lib/escape.c create mode 100644 lib/escape.h create mode 100644 lib/file.c create mode 100644 lib/file.h create mode 100644 lib/fileinfo.c create mode 100644 lib/fileinfo.h create mode 100644 lib/firefox-db2pem.sh create mode 100644 lib/formdata.c create mode 100644 lib/formdata.h create mode 100644 lib/ftp.c create mode 100644 lib/ftp.h create mode 100644 lib/ftplistparser.c create mode 100644 lib/ftplistparser.h create mode 100644 lib/getenv.c create mode 100644 lib/getinfo.c create mode 100644 lib/getinfo.h create mode 100644 lib/gopher.c create mode 100644 lib/gopher.h create mode 100644 lib/hash.c create mode 100644 lib/hash.h create mode 100644 lib/hmac.c create mode 100644 lib/hostasyn.c create mode 100644 lib/hostcheck.c create mode 100644 lib/hostcheck.h create mode 100644 lib/hostip.c create mode 100644 lib/hostip.h create mode 100644 lib/hostip4.c create mode 100644 lib/hostip6.c create mode 100644 lib/hostsyn.c create mode 100644 lib/http.c create mode 100644 lib/http.h create mode 100644 lib/http2.c create mode 100644 lib/http2.h create mode 100644 lib/http_chunks.c create mode 100644 lib/http_chunks.h create mode 100644 lib/http_digest.c create mode 100644 lib/http_digest.h create mode 100644 lib/http_negotiate.c create mode 100644 lib/http_negotiate.h create mode 100644 lib/http_ntlm.c create mode 100644 lib/http_ntlm.h create mode 100644 lib/http_proxy.c create mode 100644 lib/http_proxy.h create mode 100644 lib/idn_win32.c create mode 100644 lib/if2ip.c create mode 100644 lib/if2ip.h create mode 100644 lib/imap.c create mode 100644 lib/imap.h create mode 100644 lib/inet_ntop.c create mode 100644 lib/inet_ntop.h create mode 100644 lib/inet_pton.c create mode 100644 lib/inet_pton.h create mode 100644 lib/krb5.c create mode 100644 lib/ldap.c create mode 100644 lib/libcurl.plist create mode 100644 lib/libcurl.rc create mode 100644 lib/libcurl.vers.in create mode 100644 lib/llist.c create mode 100644 lib/llist.h create mode 100644 lib/makefile.amiga create mode 100644 lib/makefile.dj create mode 100644 lib/md4.c create mode 100644 lib/md5.c create mode 100644 lib/memdebug.c create mode 100644 lib/memdebug.h create mode 100644 lib/mime.c create mode 100644 lib/mime.h create mode 100755 lib/mk-ca-bundle.pl create mode 100755 lib/mk-ca-bundle.vbs create mode 100644 lib/mprintf.c create mode 100644 lib/multi.c create mode 100644 lib/multihandle.h create mode 100644 lib/multiif.h create mode 100644 lib/netrc.c create mode 100644 lib/netrc.h create mode 100644 lib/non-ascii.c create mode 100644 lib/non-ascii.h create mode 100644 lib/nonblock.c create mode 100644 lib/nonblock.h create mode 100644 lib/nwlib.c create mode 100644 lib/nwos.c create mode 100644 lib/openldap.c create mode 100644 lib/parsedate.c create mode 100644 lib/parsedate.h create mode 100644 lib/pingpong.c create mode 100644 lib/pingpong.h create mode 100644 lib/pop3.c create mode 100644 lib/pop3.h create mode 100644 lib/progress.c create mode 100644 lib/progress.h create mode 100644 lib/psl.c create mode 100644 lib/psl.h create mode 100644 lib/quic.h create mode 100644 lib/rand.c create mode 100644 lib/rand.h create mode 100644 lib/rename.c create mode 100644 lib/rename.h create mode 100644 lib/rtsp.c create mode 100644 lib/rtsp.h create mode 100644 lib/security.c create mode 100644 lib/select.c create mode 100644 lib/select.h create mode 100644 lib/sendf.c create mode 100644 lib/sendf.h create mode 100644 lib/setopt.c create mode 100644 lib/setopt.h create mode 100644 lib/setup-os400.h create mode 100644 lib/setup-vms.h create mode 100644 lib/sha256.c create mode 100644 lib/share.c create mode 100644 lib/share.h create mode 100644 lib/sigpipe.h create mode 100644 lib/slist.c create mode 100644 lib/slist.h create mode 100644 lib/smb.c create mode 100644 lib/smb.h create mode 100644 lib/smtp.c create mode 100644 lib/smtp.h create mode 100644 lib/sockaddr.h create mode 100644 lib/socketpair.c create mode 100644 lib/socketpair.h create mode 100644 lib/socks.c create mode 100644 lib/socks.h create mode 100644 lib/socks_gssapi.c create mode 100644 lib/socks_sspi.c create mode 100644 lib/speedcheck.c create mode 100644 lib/speedcheck.h create mode 100644 lib/splay.c create mode 100644 lib/splay.h create mode 100644 lib/strcase.c create mode 100644 lib/strcase.h create mode 100644 lib/strdup.c create mode 100644 lib/strdup.h create mode 100644 lib/strerror.c create mode 100644 lib/strerror.h create mode 100644 lib/strtok.c create mode 100644 lib/strtok.h create mode 100644 lib/strtoofft.c create mode 100644 lib/strtoofft.h create mode 100644 lib/system_win32.c create mode 100644 lib/system_win32.h create mode 100644 lib/telnet.c create mode 100644 lib/telnet.h create mode 100644 lib/tftp.c create mode 100644 lib/tftp.h create mode 100644 lib/timeval.c create mode 100644 lib/timeval.h create mode 100644 lib/transfer.c create mode 100644 lib/transfer.h create mode 100644 lib/url.c create mode 100644 lib/url.h create mode 100644 lib/urlapi-int.h create mode 100644 lib/urlapi.c create mode 100644 lib/urldata.h create mode 100644 lib/vauth/cleartext.c create mode 100644 lib/vauth/cram.c create mode 100644 lib/vauth/digest.c create mode 100644 lib/vauth/digest.h create mode 100644 lib/vauth/digest_sspi.c create mode 100644 lib/vauth/krb5_gssapi.c create mode 100644 lib/vauth/krb5_sspi.c create mode 100644 lib/vauth/ntlm.c create mode 100644 lib/vauth/ntlm.h create mode 100644 lib/vauth/ntlm_sspi.c create mode 100644 lib/vauth/oauth2.c create mode 100644 lib/vauth/spnego_gssapi.c create mode 100644 lib/vauth/spnego_sspi.c create mode 100644 lib/vauth/vauth.c create mode 100644 lib/vauth/vauth.h create mode 100644 lib/version.c create mode 100644 lib/vquic/ngtcp2.c create mode 100644 lib/vquic/ngtcp2.h create mode 100644 lib/vquic/quiche.c create mode 100644 lib/vquic/quiche.h create mode 100644 lib/vssh/libssh.c create mode 100644 lib/vssh/libssh2.c create mode 100644 lib/vssh/ssh.h create mode 100644 lib/vssh/wolfssh.c create mode 100644 lib/vssh/wolfssh.h create mode 100644 lib/vtls/bearssl.c create mode 100644 lib/vtls/bearssl.h create mode 100644 lib/vtls/gskit.c create mode 100644 lib/vtls/gskit.h create mode 100644 lib/vtls/gtls.c create mode 100644 lib/vtls/gtls.h create mode 100644 lib/vtls/mbedtls.c create mode 100644 lib/vtls/mbedtls.h create mode 100644 lib/vtls/mbedtls_threadlock.c create mode 100644 lib/vtls/mbedtls_threadlock.h create mode 100644 lib/vtls/mesalink.c create mode 100644 lib/vtls/mesalink.h create mode 100644 lib/vtls/nss.c create mode 100644 lib/vtls/nssg.h create mode 100644 lib/vtls/openssl.c create mode 100644 lib/vtls/openssl.h create mode 100644 lib/vtls/schannel.c create mode 100644 lib/vtls/schannel.h create mode 100644 lib/vtls/schannel_verify.c create mode 100644 lib/vtls/sectransp.c create mode 100644 lib/vtls/sectransp.h create mode 100644 lib/vtls/vtls.c create mode 100644 lib/vtls/vtls.h create mode 100644 lib/vtls/wolfssl.c create mode 100644 lib/vtls/wolfssl.h create mode 100644 lib/warnless.c create mode 100644 lib/warnless.h create mode 100644 lib/wildcard.c create mode 100644 lib/wildcard.h create mode 100644 lib/x509asn1.c create mode 100644 lib/x509asn1.h create mode 100644 libcurl.pc.in create mode 100644 m4/.gitignore create mode 100644 m4/ax_compile_check_sizeof.m4 create mode 100644 m4/curl-compilers.m4 create mode 100644 m4/curl-confopts.m4 create mode 100644 m4/curl-functions.m4 create mode 100644 m4/curl-openssl.m4 create mode 100644 m4/curl-override.m4 create mode 100644 m4/curl-reentrant.m4 create mode 100644 m4/xc-am-iface.m4 create mode 100644 m4/xc-cc-check.m4 create mode 100644 m4/xc-lt-iface.m4 create mode 100644 m4/xc-translit.m4 create mode 100644 m4/xc-val-flgs.m4 create mode 100644 m4/zz40-xc-ovr.m4 create mode 100644 m4/zz50-xc-ovr.m4 create mode 100644 m4/zz60-xc-ovr.m4 create mode 100755 maketgz create mode 100644 packages/Android/Android.mk create mode 100644 packages/DOS/README create mode 100644 packages/DOS/common.dj create mode 100644 packages/Makefile.am create mode 100644 packages/OS400/README.OS400 create mode 100644 packages/OS400/ccsidcurl.c create mode 100644 packages/OS400/ccsidcurl.h create mode 100644 packages/OS400/chkstrings.c create mode 100644 packages/OS400/curl.inc.in create mode 100644 packages/OS400/initscript.sh create mode 100644 packages/OS400/make-include.sh create mode 100644 packages/OS400/make-lib.sh create mode 100644 packages/OS400/make-src.sh create mode 100644 packages/OS400/make-tests.sh create mode 100644 packages/OS400/makefile.sh create mode 100644 packages/OS400/os400sys.c create mode 100644 packages/OS400/os400sys.h create mode 100644 packages/README create mode 100644 packages/Symbian/bwins/libcurlu.def create mode 100644 packages/Symbian/eabi/libcurlu.def create mode 100644 packages/Symbian/group/bld.inf create mode 100644 packages/Symbian/group/curl.iby create mode 100644 packages/Symbian/group/curl.mmp create mode 100644 packages/Symbian/group/curl.pkg create mode 100644 packages/Symbian/group/libcurl.iby create mode 100644 packages/Symbian/group/libcurl.mmp create mode 100644 packages/Symbian/group/libcurl.pkg create mode 100644 packages/Symbian/readme.txt create mode 100644 packages/TPF/curl.mak create mode 100644 packages/TPF/maketpf.env_curl create mode 100644 packages/TPF/maketpf.env_curllib create mode 100644 packages/vms/Makefile.am create mode 100644 packages/vms/backup_gnv_curl_src.com create mode 100644 packages/vms/build_curl-config_script.com create mode 100644 packages/vms/build_gnv_curl.com create mode 100644 packages/vms/build_gnv_curl_pcsi_desc.com create mode 100644 packages/vms/build_gnv_curl_pcsi_text.com create mode 100644 packages/vms/build_gnv_curl_release_notes.com create mode 100644 packages/vms/build_libcurl_pc.com create mode 100644 packages/vms/build_vms.com create mode 100644 packages/vms/clean_gnv_curl.com create mode 100644 packages/vms/compare_curl_source.com create mode 100644 packages/vms/config_h.com create mode 100644 packages/vms/curl_crtl_init.c create mode 100644 packages/vms/curl_gnv_build_steps.txt create mode 100644 packages/vms/curl_release_note_start.txt create mode 100644 packages/vms/curl_startup.com create mode 100644 packages/vms/curlmsg.h create mode 100644 packages/vms/curlmsg.msg create mode 100644 packages/vms/curlmsg.sdl create mode 100644 packages/vms/curlmsg_vms.h create mode 100644 packages/vms/generate_config_vms_h_curl.com create mode 100644 packages/vms/generate_vax_transfer.com create mode 100644 packages/vms/gnv_conftest.c_first create mode 100644 packages/vms/gnv_curl_configure.sh create mode 100644 packages/vms/gnv_libcurl_symbols.opt create mode 100644 packages/vms/gnv_link_curl.com create mode 100644 packages/vms/macro32_exactcase.patch create mode 100644 packages/vms/make_gnv_curl_install.sh create mode 100644 packages/vms/make_pcsi_curl_kit_name.com create mode 100644 packages/vms/pcsi_gnv_curl_file_list.txt create mode 100644 packages/vms/pcsi_product_gnv_curl.com create mode 100644 packages/vms/readme create mode 100644 packages/vms/report_openssl_version.c create mode 100644 packages/vms/setup_gnv_curl_build.com create mode 100644 packages/vms/stage_curl_install.com create mode 100644 packages/vms/vms_eco_level.h create mode 100644 plan9/BUILD.PLAN9.txt create mode 100644 plan9/include/mkfile create mode 100644 plan9/lib/mkfile create mode 100755 plan9/lib/mkfile.inc create mode 100644 plan9/mkfile create mode 100644 plan9/mkfile.proto create mode 100644 plan9/src/mkfile create mode 100755 plan9/src/mkfile.inc create mode 100644 projects/README create mode 100644 projects/Windows/.gitattributes create mode 100644 projects/Windows/.gitignore create mode 100644 projects/Windows/VC10/.gitignore create mode 100644 projects/Windows/VC10/curl-all.sln create mode 100644 projects/Windows/VC10/lib/.gitignore create mode 100644 projects/Windows/VC10/lib/libcurl.sln create mode 100644 projects/Windows/VC10/lib/libcurl.tmpl create mode 100644 projects/Windows/VC10/lib/libcurl.vcxproj.filters create mode 100644 projects/Windows/VC10/src/.gitignore create mode 100644 projects/Windows/VC10/src/curl.sln create mode 100644 projects/Windows/VC10/src/curl.tmpl create mode 100644 projects/Windows/VC10/src/curl.vcxproj.filters create mode 100644 projects/Windows/VC11/.gitignore create mode 100644 projects/Windows/VC11/curl-all.sln create mode 100644 projects/Windows/VC11/lib/.gitignore create mode 100644 projects/Windows/VC11/lib/libcurl.sln create mode 100644 projects/Windows/VC11/lib/libcurl.tmpl create mode 100644 projects/Windows/VC11/lib/libcurl.vcxproj.filters create mode 100644 projects/Windows/VC11/src/.gitignore create mode 100644 projects/Windows/VC11/src/curl.sln create mode 100644 projects/Windows/VC11/src/curl.tmpl create mode 100644 projects/Windows/VC11/src/curl.vcxproj.filters create mode 100644 projects/Windows/VC12/.gitignore create mode 100644 projects/Windows/VC12/curl-all.sln create mode 100644 projects/Windows/VC12/lib/.gitignore create mode 100644 projects/Windows/VC12/lib/libcurl.sln create mode 100644 projects/Windows/VC12/lib/libcurl.tmpl create mode 100644 projects/Windows/VC12/lib/libcurl.vcxproj.filters create mode 100644 projects/Windows/VC12/src/.gitignore create mode 100644 projects/Windows/VC12/src/curl.sln create mode 100644 projects/Windows/VC12/src/curl.tmpl create mode 100644 projects/Windows/VC12/src/curl.vcxproj.filters create mode 100644 projects/Windows/VC14/.gitignore create mode 100644 projects/Windows/VC14/curl-all.sln create mode 100644 projects/Windows/VC14/lib/.gitignore create mode 100644 projects/Windows/VC14/lib/libcurl.sln create mode 100644 projects/Windows/VC14/lib/libcurl.tmpl create mode 100644 projects/Windows/VC14/lib/libcurl.vcxproj.filters create mode 100644 projects/Windows/VC14/src/.gitignore create mode 100644 projects/Windows/VC14/src/curl.sln create mode 100644 projects/Windows/VC14/src/curl.tmpl create mode 100644 projects/Windows/VC14/src/curl.vcxproj.filters create mode 100644 projects/Windows/VC15/.gitignore create mode 100644 projects/Windows/VC15/curl-all.sln create mode 100644 projects/Windows/VC15/lib/.gitignore create mode 100644 projects/Windows/VC15/lib/libcurl.sln create mode 100644 projects/Windows/VC15/lib/libcurl.tmpl create mode 100644 projects/Windows/VC15/lib/libcurl.vcxproj.filters create mode 100644 projects/Windows/VC15/src/.gitignore create mode 100644 projects/Windows/VC15/src/curl.sln create mode 100644 projects/Windows/VC15/src/curl.tmpl create mode 100644 projects/Windows/VC15/src/curl.vcxproj.filters create mode 100644 projects/Windows/VC6/.gitignore create mode 100644 projects/Windows/VC6/curl-all.dsw create mode 100644 projects/Windows/VC6/lib/.gitignore create mode 100644 projects/Windows/VC6/lib/libcurl.dsw create mode 100644 projects/Windows/VC6/lib/libcurl.tmpl create mode 100644 projects/Windows/VC6/src/.gitignore create mode 100644 projects/Windows/VC6/src/curl.dsw create mode 100644 projects/Windows/VC6/src/curl.tmpl create mode 100644 projects/Windows/VC7.1/.gitignore create mode 100644 projects/Windows/VC7.1/curl-all.sln create mode 100644 projects/Windows/VC7.1/lib/.gitignore create mode 100644 projects/Windows/VC7.1/lib/libcurl.sln create mode 100644 projects/Windows/VC7.1/lib/libcurl.tmpl create mode 100644 projects/Windows/VC7.1/src/.gitignore create mode 100644 projects/Windows/VC7.1/src/curl.sln create mode 100644 projects/Windows/VC7.1/src/curl.tmpl create mode 100644 projects/Windows/VC7/.gitignore create mode 100644 projects/Windows/VC7/curl-all.sln create mode 100644 projects/Windows/VC7/lib/.gitignore create mode 100644 projects/Windows/VC7/lib/libcurl.sln create mode 100644 projects/Windows/VC7/lib/libcurl.tmpl create mode 100644 projects/Windows/VC7/src/.gitignore create mode 100644 projects/Windows/VC7/src/curl.sln create mode 100644 projects/Windows/VC7/src/curl.tmpl create mode 100644 projects/Windows/VC8/.gitignore create mode 100644 projects/Windows/VC8/curl-all.sln create mode 100644 projects/Windows/VC8/lib/.gitignore create mode 100644 projects/Windows/VC8/lib/libcurl.sln create mode 100644 projects/Windows/VC8/lib/libcurl.tmpl create mode 100644 projects/Windows/VC8/src/.gitignore create mode 100644 projects/Windows/VC8/src/curl.sln create mode 100644 projects/Windows/VC8/src/curl.tmpl create mode 100644 projects/Windows/VC9/.gitignore create mode 100644 projects/Windows/VC9/curl-all.sln create mode 100644 projects/Windows/VC9/lib/.gitignore create mode 100644 projects/Windows/VC9/lib/libcurl.sln create mode 100644 projects/Windows/VC9/lib/libcurl.tmpl create mode 100644 projects/Windows/VC9/src/.gitignore create mode 100644 projects/Windows/VC9/src/curl.sln create mode 100644 projects/Windows/VC9/src/curl.tmpl create mode 100644 projects/build-openssl.bat create mode 100644 projects/build-wolfssl.bat create mode 100644 projects/checksrc.bat create mode 100644 projects/generate.bat create mode 100644 projects/wolfssl_options.h create mode 100644 projects/wolfssl_override.props create mode 100644 scripts/Makefile.am create mode 100755 scripts/completion.pl create mode 100755 scripts/contributors.sh create mode 100755 scripts/contrithanks.sh create mode 100755 scripts/coverage.sh create mode 100755 scripts/delta create mode 100644 scripts/installcheck.sh create mode 100755 scripts/log2changes.pl create mode 100755 scripts/singleuse.pl create mode 100755 scripts/travis/before_script.sh create mode 100755 scripts/travis/iconv-env.sh create mode 100755 scripts/travis/script.sh create mode 100755 scripts/updatemanpages.pl create mode 100644 src/.gitignore create mode 100644 src/CMakeLists.txt create mode 100644 src/Makefile.Watcom create mode 100644 src/Makefile.am create mode 100644 src/Makefile.inc create mode 100644 src/Makefile.m32 create mode 100644 src/Makefile.netware create mode 100644 src/curl.rc create mode 100644 src/macos/MACINSTALL.TXT create mode 100644 src/macos/curl.mcp.xml.sit.hqx create mode 100644 src/macos/src/curl_GUSIConfig.cpp create mode 100644 src/macos/src/macos_main.cpp create mode 100644 src/makefile.amiga create mode 100644 src/makefile.dj create mode 100755 src/mkhelp.pl create mode 100644 src/slist_wc.c create mode 100644 src/slist_wc.h create mode 100644 src/tool_binmode.c create mode 100644 src/tool_binmode.h create mode 100644 src/tool_bname.c create mode 100644 src/tool_bname.h create mode 100644 src/tool_cb_dbg.c create mode 100644 src/tool_cb_dbg.h create mode 100644 src/tool_cb_hdr.c create mode 100644 src/tool_cb_hdr.h create mode 100644 src/tool_cb_prg.c create mode 100644 src/tool_cb_prg.h create mode 100644 src/tool_cb_rea.c create mode 100644 src/tool_cb_rea.h create mode 100644 src/tool_cb_see.c create mode 100644 src/tool_cb_see.h create mode 100644 src/tool_cb_wrt.c create mode 100644 src/tool_cb_wrt.h create mode 100644 src/tool_cfgable.c create mode 100644 src/tool_cfgable.h create mode 100644 src/tool_convert.c create mode 100644 src/tool_convert.h create mode 100644 src/tool_dirhie.c create mode 100644 src/tool_dirhie.h create mode 100644 src/tool_doswin.c create mode 100644 src/tool_doswin.h create mode 100644 src/tool_easysrc.c create mode 100644 src/tool_easysrc.h create mode 100644 src/tool_filetime.c create mode 100644 src/tool_filetime.h create mode 100644 src/tool_formparse.c create mode 100644 src/tool_formparse.h create mode 100644 src/tool_getparam.c create mode 100644 src/tool_getparam.h create mode 100644 src/tool_getpass.c create mode 100644 src/tool_getpass.h create mode 100644 src/tool_help.c create mode 100644 src/tool_help.h create mode 100644 src/tool_helpers.c create mode 100644 src/tool_helpers.h create mode 100644 src/tool_homedir.c create mode 100644 src/tool_homedir.h create mode 100644 src/tool_hugehelp.c.cvs create mode 100644 src/tool_hugehelp.h create mode 100644 src/tool_libinfo.c create mode 100644 src/tool_libinfo.h create mode 100644 src/tool_main.c create mode 100644 src/tool_main.h create mode 100644 src/tool_metalink.c create mode 100644 src/tool_metalink.h create mode 100644 src/tool_msgs.c create mode 100644 src/tool_msgs.h create mode 100644 src/tool_operate.c create mode 100644 src/tool_operate.h create mode 100644 src/tool_operhlp.c create mode 100644 src/tool_operhlp.h create mode 100644 src/tool_panykey.c create mode 100644 src/tool_panykey.h create mode 100644 src/tool_paramhlp.c create mode 100644 src/tool_paramhlp.h create mode 100644 src/tool_parsecfg.c create mode 100644 src/tool_parsecfg.h create mode 100644 src/tool_progress.c create mode 100644 src/tool_progress.h create mode 100644 src/tool_sdecls.h create mode 100644 src/tool_setopt.c create mode 100644 src/tool_setopt.h create mode 100644 src/tool_setup.h create mode 100644 src/tool_sleep.c create mode 100644 src/tool_sleep.h create mode 100644 src/tool_strdup.c create mode 100644 src/tool_strdup.h create mode 100644 src/tool_urlglob.c create mode 100644 src/tool_urlglob.h create mode 100644 src/tool_util.c create mode 100644 src/tool_util.h create mode 100644 src/tool_version.h create mode 100644 src/tool_vms.c create mode 100644 src/tool_vms.h create mode 100644 src/tool_writeout.c create mode 100644 src/tool_writeout.h create mode 100644 src/tool_xattr.c create mode 100644 src/tool_xattr.h create mode 100644 tests/.gitignore create mode 100644 tests/CMakeLists.txt create mode 100644 tests/FILEFORMAT create mode 100644 tests/Makefile.am create mode 100644 tests/README create mode 100644 tests/appveyor.pm create mode 100644 tests/azure.pm create mode 100755 tests/badsymbols.pl create mode 100644 tests/certs/EdelCurlRoot-ca.cacert create mode 100644 tests/certs/EdelCurlRoot-ca.cnf create mode 100644 tests/certs/EdelCurlRoot-ca.crt create mode 100644 tests/certs/EdelCurlRoot-ca.csr create mode 100644 tests/certs/EdelCurlRoot-ca.der create mode 100644 tests/certs/EdelCurlRoot-ca.key create mode 100644 tests/certs/EdelCurlRoot-ca.prm create mode 100644 tests/certs/Makefile.am create mode 100644 tests/certs/Server-localhost-firstSAN-sv.crl create mode 100644 tests/certs/Server-localhost-firstSAN-sv.crt create mode 100644 tests/certs/Server-localhost-firstSAN-sv.csr create mode 100644 tests/certs/Server-localhost-firstSAN-sv.der create mode 100644 tests/certs/Server-localhost-firstSAN-sv.dhp create mode 100644 tests/certs/Server-localhost-firstSAN-sv.key create mode 100644 tests/certs/Server-localhost-firstSAN-sv.pem create mode 100644 tests/certs/Server-localhost-firstSAN-sv.prm create mode 100644 tests/certs/Server-localhost-firstSAN-sv.pub.der create mode 100644 tests/certs/Server-localhost-firstSAN-sv.pub.pem create mode 100644 tests/certs/Server-localhost-lastSAN-sv.crl create mode 100644 tests/certs/Server-localhost-lastSAN-sv.crt create mode 100644 tests/certs/Server-localhost-lastSAN-sv.csr create mode 100644 tests/certs/Server-localhost-lastSAN-sv.der create mode 100644 tests/certs/Server-localhost-lastSAN-sv.dhp create mode 100644 tests/certs/Server-localhost-lastSAN-sv.key create mode 100644 tests/certs/Server-localhost-lastSAN-sv.pem create mode 100644 tests/certs/Server-localhost-lastSAN-sv.prm create mode 100644 tests/certs/Server-localhost-lastSAN-sv.pub.der create mode 100644 tests/certs/Server-localhost-lastSAN-sv.pub.pem create mode 100644 tests/certs/Server-localhost-sv.crl create mode 100644 tests/certs/Server-localhost-sv.crt create mode 100644 tests/certs/Server-localhost-sv.csr create mode 100644 tests/certs/Server-localhost-sv.der create mode 100644 tests/certs/Server-localhost-sv.dhp create mode 100644 tests/certs/Server-localhost-sv.key create mode 100644 tests/certs/Server-localhost-sv.pem create mode 100644 tests/certs/Server-localhost-sv.prm create mode 100644 tests/certs/Server-localhost-sv.pub.der create mode 100644 tests/certs/Server-localhost-sv.pub.pem create mode 100644 tests/certs/Server-localhost.nn-sv.crl create mode 100644 tests/certs/Server-localhost.nn-sv.crt create mode 100644 tests/certs/Server-localhost.nn-sv.csr create mode 100644 tests/certs/Server-localhost.nn-sv.der create mode 100644 tests/certs/Server-localhost.nn-sv.dhp create mode 100644 tests/certs/Server-localhost.nn-sv.key create mode 100644 tests/certs/Server-localhost.nn-sv.pem create mode 100644 tests/certs/Server-localhost.nn-sv.prm create mode 100644 tests/certs/Server-localhost.nn-sv.pub.der create mode 100644 tests/certs/Server-localhost.nn-sv.pub.pem create mode 100644 tests/certs/Server-localhost0h-sv.crl create mode 100644 tests/certs/Server-localhost0h-sv.crt create mode 100644 tests/certs/Server-localhost0h-sv.csr create mode 100644 tests/certs/Server-localhost0h-sv.der create mode 100644 tests/certs/Server-localhost0h-sv.dhp create mode 100644 tests/certs/Server-localhost0h-sv.key create mode 100644 tests/certs/Server-localhost0h-sv.pem create mode 100644 tests/certs/Server-localhost0h-sv.prm create mode 100644 tests/certs/Server-localhost0h-sv.pub.der create mode 100644 tests/certs/Server-localhost0h-sv.pub.pem create mode 100644 tests/certs/scripts/Makefile.am create mode 100755 tests/certs/scripts/genroot.sh create mode 100755 tests/certs/scripts/genserv.sh create mode 100644 tests/certs/srp-verifier-conf create mode 100644 tests/certs/srp-verifier-db create mode 100755 tests/convsrctest.pl create mode 100755 tests/curl_test_data.py create mode 100644 tests/data/.gitattributes create mode 100644 tests/data/.gitignore create mode 100644 tests/data/CMakeLists.txt create mode 100644 tests/data/DISABLED create mode 100644 tests/data/Makefile.am create mode 100644 tests/data/Makefile.inc create mode 100644 tests/data/test1 create mode 100644 tests/data/test10 create mode 100644 tests/data/test100 create mode 100644 tests/data/test1000 create mode 100644 tests/data/test1001 create mode 100644 tests/data/test1002 create mode 100644 tests/data/test1003 create mode 100644 tests/data/test1004 create mode 100644 tests/data/test1005 create mode 100644 tests/data/test1006 create mode 100644 tests/data/test1007 create mode 100644 tests/data/test1008 create mode 100644 tests/data/test1009 create mode 100644 tests/data/test101 create mode 100644 tests/data/test1010 create mode 100644 tests/data/test1011 create mode 100644 tests/data/test1012 create mode 100644 tests/data/test1013 create mode 100644 tests/data/test1014 create mode 100644 tests/data/test1015 create mode 100644 tests/data/test1016 create mode 100644 tests/data/test1017 create mode 100644 tests/data/test1018 create mode 100644 tests/data/test1019 create mode 100644 tests/data/test102 create mode 100644 tests/data/test1020 create mode 100644 tests/data/test1021 create mode 100644 tests/data/test1022 create mode 100644 tests/data/test1023 create mode 100644 tests/data/test1024 create mode 100644 tests/data/test1025 create mode 100644 tests/data/test1026 create mode 100644 tests/data/test1027 create mode 100644 tests/data/test1028 create mode 100644 tests/data/test1029 create mode 100644 tests/data/test103 create mode 100644 tests/data/test1030 create mode 100644 tests/data/test1031 create mode 100644 tests/data/test1032 create mode 100644 tests/data/test1033 create mode 100644 tests/data/test1034 create mode 100644 tests/data/test1035 create mode 100644 tests/data/test1036 create mode 100644 tests/data/test1037 create mode 100644 tests/data/test1038 create mode 100644 tests/data/test1039 create mode 100644 tests/data/test104 create mode 100644 tests/data/test1040 create mode 100644 tests/data/test1041 create mode 100644 tests/data/test1042 create mode 100644 tests/data/test1043 create mode 100644 tests/data/test1044 create mode 100644 tests/data/test1045 create mode 100644 tests/data/test1046 create mode 100644 tests/data/test1047 create mode 100644 tests/data/test1048 create mode 100644 tests/data/test1049 create mode 100644 tests/data/test105 create mode 100644 tests/data/test1050 create mode 100644 tests/data/test1051 create mode 100644 tests/data/test1052 create mode 100644 tests/data/test1053 create mode 100644 tests/data/test1054 create mode 100644 tests/data/test1055 create mode 100644 tests/data/test1056 create mode 100644 tests/data/test1057 create mode 100644 tests/data/test1058 create mode 100644 tests/data/test1059 create mode 100644 tests/data/test106 create mode 100644 tests/data/test1060 create mode 100644 tests/data/test1061 create mode 100644 tests/data/test1062 create mode 100644 tests/data/test1063 create mode 100644 tests/data/test1064 create mode 100644 tests/data/test1065 create mode 100644 tests/data/test1066 create mode 100644 tests/data/test1067 create mode 100644 tests/data/test1068 create mode 100644 tests/data/test1069 create mode 100644 tests/data/test107 create mode 100644 tests/data/test1070 create mode 100644 tests/data/test1071 create mode 100644 tests/data/test1072 create mode 100644 tests/data/test1073 create mode 100644 tests/data/test1074 create mode 100644 tests/data/test1075 create mode 100644 tests/data/test1076 create mode 100644 tests/data/test1077 create mode 100644 tests/data/test1078 create mode 100644 tests/data/test1079 create mode 100644 tests/data/test108 create mode 100644 tests/data/test1080 create mode 100644 tests/data/test1081 create mode 100644 tests/data/test1082 create mode 100644 tests/data/test1083 create mode 100644 tests/data/test1084 create mode 100644 tests/data/test1085 create mode 100644 tests/data/test1086 create mode 100644 tests/data/test1087 create mode 100644 tests/data/test1088 create mode 100644 tests/data/test1089 create mode 100644 tests/data/test109 create mode 100644 tests/data/test1090 create mode 100644 tests/data/test1091 create mode 100644 tests/data/test1092 create mode 100644 tests/data/test1093 create mode 100644 tests/data/test1094 create mode 100644 tests/data/test1095 create mode 100644 tests/data/test1096 create mode 100644 tests/data/test1097 create mode 100644 tests/data/test1098 create mode 100644 tests/data/test1099 create mode 100644 tests/data/test11 create mode 100644 tests/data/test110 create mode 100644 tests/data/test1100 create mode 100644 tests/data/test1101 create mode 100644 tests/data/test1102 create mode 100644 tests/data/test1103 create mode 100644 tests/data/test1104 create mode 100644 tests/data/test1105 create mode 100644 tests/data/test1106 create mode 100644 tests/data/test1107 create mode 100644 tests/data/test1108 create mode 100644 tests/data/test1109 create mode 100644 tests/data/test111 create mode 100644 tests/data/test1110 create mode 100644 tests/data/test1111 create mode 100644 tests/data/test1112 create mode 100644 tests/data/test1113 create mode 100644 tests/data/test1114 create mode 100644 tests/data/test1115 create mode 100644 tests/data/test1116 create mode 100644 tests/data/test1117 create mode 100644 tests/data/test1118 create mode 100644 tests/data/test1119 create mode 100644 tests/data/test112 create mode 100644 tests/data/test1120 create mode 100644 tests/data/test1121 create mode 100644 tests/data/test1122 create mode 100644 tests/data/test1123 create mode 100644 tests/data/test1124 create mode 100644 tests/data/test1125 create mode 100644 tests/data/test1126 create mode 100644 tests/data/test1127 create mode 100644 tests/data/test1128 create mode 100644 tests/data/test1129 create mode 100644 tests/data/test113 create mode 100644 tests/data/test1130 create mode 100644 tests/data/test1131 create mode 100644 tests/data/test1132 create mode 100644 tests/data/test1133 create mode 100644 tests/data/test1134 create mode 100644 tests/data/test1135 create mode 100644 tests/data/test1136 create mode 100644 tests/data/test1137 create mode 100644 tests/data/test1138 create mode 100644 tests/data/test1139 create mode 100644 tests/data/test114 create mode 100644 tests/data/test1140 create mode 100644 tests/data/test1141 create mode 100644 tests/data/test1142 create mode 100644 tests/data/test1143 create mode 100644 tests/data/test1144 create mode 100644 tests/data/test1145 create mode 100644 tests/data/test1146 create mode 100644 tests/data/test1147 create mode 100644 tests/data/test1148 create mode 100644 tests/data/test1149 create mode 100644 tests/data/test115 create mode 100644 tests/data/test1150 create mode 100644 tests/data/test1151 create mode 100644 tests/data/test1152 create mode 100644 tests/data/test1153 create mode 100644 tests/data/test1154 create mode 100644 tests/data/test1155 create mode 100644 tests/data/test1156 create mode 100644 tests/data/test1157 create mode 100644 tests/data/test1158 create mode 100644 tests/data/test1159 create mode 100644 tests/data/test116 create mode 100644 tests/data/test1160 create mode 100644 tests/data/test1161 create mode 100644 tests/data/test1162 create mode 100644 tests/data/test1163 create mode 100644 tests/data/test1164 create mode 100644 tests/data/test1165 create mode 100644 tests/data/test1166 create mode 100644 tests/data/test1167 create mode 100644 tests/data/test117 create mode 100644 tests/data/test1170 create mode 100644 tests/data/test1171 create mode 100644 tests/data/test1172 create mode 100644 tests/data/test1173 create mode 100644 tests/data/test1174 create mode 100644 tests/data/test1175 create mode 100644 tests/data/test1176 create mode 100644 tests/data/test118 create mode 100644 tests/data/test119 create mode 100644 tests/data/test12 create mode 100644 tests/data/test120 create mode 100644 tests/data/test1200 create mode 100644 tests/data/test1201 create mode 100644 tests/data/test1202 create mode 100644 tests/data/test1203 create mode 100644 tests/data/test1204 create mode 100644 tests/data/test1205 create mode 100644 tests/data/test1206 create mode 100644 tests/data/test1207 create mode 100644 tests/data/test1208 create mode 100644 tests/data/test1209 create mode 100644 tests/data/test121 create mode 100644 tests/data/test1210 create mode 100644 tests/data/test1211 create mode 100644 tests/data/test1212 create mode 100644 tests/data/test1213 create mode 100644 tests/data/test1214 create mode 100644 tests/data/test1215 create mode 100644 tests/data/test1216 create mode 100644 tests/data/test1217 create mode 100644 tests/data/test1218 create mode 100644 tests/data/test1219 create mode 100644 tests/data/test122 create mode 100644 tests/data/test1220 create mode 100644 tests/data/test1221 create mode 100644 tests/data/test1222 create mode 100644 tests/data/test1223 create mode 100644 tests/data/test1224 create mode 100644 tests/data/test1225 create mode 100644 tests/data/test1226 create mode 100644 tests/data/test1227 create mode 100644 tests/data/test1228 create mode 100644 tests/data/test1229 create mode 100644 tests/data/test123 create mode 100644 tests/data/test1230 create mode 100644 tests/data/test1231 create mode 100644 tests/data/test1232 create mode 100644 tests/data/test1233 create mode 100644 tests/data/test1234 create mode 100644 tests/data/test1235 create mode 100644 tests/data/test1236 create mode 100644 tests/data/test1237 create mode 100644 tests/data/test1238 create mode 100644 tests/data/test1239 create mode 100644 tests/data/test124 create mode 100644 tests/data/test1240 create mode 100644 tests/data/test1241 create mode 100644 tests/data/test1242 create mode 100644 tests/data/test1243 create mode 100644 tests/data/test1244 create mode 100644 tests/data/test1245 create mode 100644 tests/data/test1246 create mode 100644 tests/data/test1247 create mode 100644 tests/data/test1248 create mode 100644 tests/data/test1249 create mode 100644 tests/data/test125 create mode 100644 tests/data/test1250 create mode 100644 tests/data/test1251 create mode 100644 tests/data/test1252 create mode 100644 tests/data/test1253 create mode 100644 tests/data/test1254 create mode 100644 tests/data/test1255 create mode 100644 tests/data/test1256 create mode 100644 tests/data/test1257 create mode 100644 tests/data/test1258 create mode 100644 tests/data/test1259 create mode 100644 tests/data/test126 create mode 100644 tests/data/test1260 create mode 100644 tests/data/test1261 create mode 100644 tests/data/test1262 create mode 100644 tests/data/test1263 create mode 100644 tests/data/test1264 create mode 100644 tests/data/test1265 create mode 100644 tests/data/test1266 create mode 100644 tests/data/test1267 create mode 100644 tests/data/test1268 create mode 100644 tests/data/test1269 create mode 100644 tests/data/test127 create mode 100644 tests/data/test1270 create mode 100644 tests/data/test1271 create mode 100644 tests/data/test128 create mode 100644 tests/data/test1280 create mode 100644 tests/data/test1281 create mode 100644 tests/data/test1282 create mode 100644 tests/data/test1283 create mode 100644 tests/data/test1284 create mode 100644 tests/data/test1285 create mode 100644 tests/data/test1286 create mode 100644 tests/data/test1287 create mode 100644 tests/data/test1288 create mode 100644 tests/data/test1289 create mode 100644 tests/data/test129 create mode 100644 tests/data/test1290 create mode 100644 tests/data/test1291 create mode 100644 tests/data/test1292 create mode 100644 tests/data/test1293 create mode 100644 tests/data/test1298 create mode 100644 tests/data/test1299 create mode 100644 tests/data/test13 create mode 100644 tests/data/test130 create mode 100644 tests/data/test1300 create mode 100644 tests/data/test1301 create mode 100644 tests/data/test1302 create mode 100644 tests/data/test1303 create mode 100644 tests/data/test1304 create mode 100644 tests/data/test1305 create mode 100644 tests/data/test1306 create mode 100644 tests/data/test1307 create mode 100644 tests/data/test1308 create mode 100644 tests/data/test1309 create mode 100644 tests/data/test131 create mode 100644 tests/data/test1310 create mode 100644 tests/data/test1311 create mode 100644 tests/data/test1312 create mode 100644 tests/data/test1313 create mode 100644 tests/data/test1314 create mode 100644 tests/data/test1315 create mode 100644 tests/data/test1316 create mode 100644 tests/data/test1317 create mode 100644 tests/data/test1318 create mode 100644 tests/data/test1319 create mode 100644 tests/data/test132 create mode 100644 tests/data/test1320 create mode 100644 tests/data/test1321 create mode 100644 tests/data/test1322 create mode 100644 tests/data/test1323 create mode 100644 tests/data/test1324 create mode 100644 tests/data/test1325 create mode 100644 tests/data/test1326 create mode 100644 tests/data/test1327 create mode 100644 tests/data/test1328 create mode 100644 tests/data/test1329 create mode 100644 tests/data/test133 create mode 100644 tests/data/test1330 create mode 100644 tests/data/test1331 create mode 100644 tests/data/test1332 create mode 100644 tests/data/test1333 create mode 100644 tests/data/test1334 create mode 100644 tests/data/test1335 create mode 100644 tests/data/test1336 create mode 100644 tests/data/test1337 create mode 100644 tests/data/test1338 create mode 100644 tests/data/test1339 create mode 100644 tests/data/test134 create mode 100644 tests/data/test1340 create mode 100644 tests/data/test1341 create mode 100644 tests/data/test1342 create mode 100644 tests/data/test1343 create mode 100644 tests/data/test1344 create mode 100644 tests/data/test1345 create mode 100644 tests/data/test1346 create mode 100644 tests/data/test1347 create mode 100644 tests/data/test1348 create mode 100644 tests/data/test1349 create mode 100644 tests/data/test135 create mode 100644 tests/data/test1350 create mode 100644 tests/data/test1351 create mode 100644 tests/data/test1352 create mode 100644 tests/data/test1353 create mode 100644 tests/data/test1354 create mode 100644 tests/data/test1355 create mode 100644 tests/data/test1356 create mode 100644 tests/data/test1357 create mode 100644 tests/data/test1358 create mode 100644 tests/data/test1359 create mode 100644 tests/data/test136 create mode 100644 tests/data/test1360 create mode 100644 tests/data/test1361 create mode 100644 tests/data/test1362 create mode 100644 tests/data/test1363 create mode 100644 tests/data/test1364 create mode 100644 tests/data/test1365 create mode 100644 tests/data/test1366 create mode 100644 tests/data/test1367 create mode 100644 tests/data/test1368 create mode 100644 tests/data/test1369 create mode 100644 tests/data/test137 create mode 100644 tests/data/test1370 create mode 100644 tests/data/test1371 create mode 100644 tests/data/test1372 create mode 100644 tests/data/test1373 create mode 100644 tests/data/test1374 create mode 100644 tests/data/test1375 create mode 100644 tests/data/test1376 create mode 100644 tests/data/test1377 create mode 100644 tests/data/test1378 create mode 100644 tests/data/test1379 create mode 100644 tests/data/test138 create mode 100644 tests/data/test1380 create mode 100644 tests/data/test1381 create mode 100644 tests/data/test1382 create mode 100644 tests/data/test1383 create mode 100644 tests/data/test1384 create mode 100644 tests/data/test1385 create mode 100644 tests/data/test1386 create mode 100644 tests/data/test1387 create mode 100644 tests/data/test1388 create mode 100644 tests/data/test1389 create mode 100644 tests/data/test139 create mode 100644 tests/data/test1390 create mode 100644 tests/data/test1391 create mode 100644 tests/data/test1392 create mode 100644 tests/data/test1393 create mode 100644 tests/data/test1394 create mode 100644 tests/data/test1395 create mode 100644 tests/data/test1396 create mode 100644 tests/data/test1397 create mode 100644 tests/data/test1398 create mode 100644 tests/data/test1399 create mode 100644 tests/data/test14 create mode 100644 tests/data/test140 create mode 100644 tests/data/test1400 create mode 100644 tests/data/test1401 create mode 100644 tests/data/test1402 create mode 100644 tests/data/test1403 create mode 100644 tests/data/test1404 create mode 100644 tests/data/test1405 create mode 100644 tests/data/test1406 create mode 100644 tests/data/test1407 create mode 100644 tests/data/test1408 create mode 100644 tests/data/test1409 create mode 100644 tests/data/test141 create mode 100644 tests/data/test1410 create mode 100644 tests/data/test1411 create mode 100644 tests/data/test1412 create mode 100644 tests/data/test1413 create mode 100644 tests/data/test1414 create mode 100644 tests/data/test1415 create mode 100644 tests/data/test1416 create mode 100644 tests/data/test1417 create mode 100644 tests/data/test1418 create mode 100644 tests/data/test1419 create mode 100644 tests/data/test142 create mode 100644 tests/data/test1420 create mode 100644 tests/data/test1421 create mode 100644 tests/data/test1422 create mode 100644 tests/data/test1423 create mode 100644 tests/data/test1424 create mode 100644 tests/data/test1425 create mode 100644 tests/data/test1426 create mode 100644 tests/data/test1427 create mode 100644 tests/data/test1428 create mode 100644 tests/data/test1429 create mode 100644 tests/data/test143 create mode 100644 tests/data/test1430 create mode 100644 tests/data/test1431 create mode 100644 tests/data/test1432 create mode 100644 tests/data/test1433 create mode 100644 tests/data/test1434 create mode 100644 tests/data/test1435 create mode 100644 tests/data/test1436 create mode 100644 tests/data/test1437 create mode 100644 tests/data/test1438 create mode 100644 tests/data/test1439 create mode 100644 tests/data/test144 create mode 100644 tests/data/test1440 create mode 100644 tests/data/test1441 create mode 100644 tests/data/test1442 create mode 100644 tests/data/test1443 create mode 100644 tests/data/test1444 create mode 100644 tests/data/test1445 create mode 100644 tests/data/test1446 create mode 100644 tests/data/test1447 create mode 100644 tests/data/test1448 create mode 100644 tests/data/test1449 create mode 100644 tests/data/test145 create mode 100644 tests/data/test1450 create mode 100644 tests/data/test1451 create mode 100644 tests/data/test1452 create mode 100644 tests/data/test1453 create mode 100644 tests/data/test1454 create mode 100644 tests/data/test1455 create mode 100644 tests/data/test1456 create mode 100644 tests/data/test1457 create mode 100644 tests/data/test1458 create mode 100644 tests/data/test1459 create mode 100644 tests/data/test146 create mode 100644 tests/data/test147 create mode 100644 tests/data/test148 create mode 100644 tests/data/test149 create mode 100644 tests/data/test15 create mode 100644 tests/data/test150 create mode 100644 tests/data/test1500 create mode 100644 tests/data/test1501 create mode 100644 tests/data/test1502 create mode 100644 tests/data/test1503 create mode 100644 tests/data/test1504 create mode 100644 tests/data/test1505 create mode 100644 tests/data/test1506 create mode 100644 tests/data/test1507 create mode 100644 tests/data/test1508 create mode 100644 tests/data/test1509 create mode 100644 tests/data/test151 create mode 100644 tests/data/test1510 create mode 100644 tests/data/test1511 create mode 100644 tests/data/test1512 create mode 100644 tests/data/test1513 create mode 100644 tests/data/test1514 create mode 100644 tests/data/test1515 create mode 100644 tests/data/test1516 create mode 100644 tests/data/test1517 create mode 100644 tests/data/test1518 create mode 100644 tests/data/test1519 create mode 100644 tests/data/test152 create mode 100644 tests/data/test1520 create mode 100644 tests/data/test1521 create mode 100644 tests/data/test1522 create mode 100644 tests/data/test1523 create mode 100644 tests/data/test1525 create mode 100644 tests/data/test1526 create mode 100644 tests/data/test1527 create mode 100644 tests/data/test1528 create mode 100644 tests/data/test1529 create mode 100644 tests/data/test153 create mode 100644 tests/data/test1530 create mode 100644 tests/data/test1531 create mode 100644 tests/data/test1532 create mode 100644 tests/data/test1533 create mode 100644 tests/data/test1534 create mode 100644 tests/data/test1535 create mode 100644 tests/data/test1536 create mode 100644 tests/data/test1537 create mode 100644 tests/data/test1538 create mode 100644 tests/data/test154 create mode 100644 tests/data/test1540 create mode 100644 tests/data/test1541 create mode 100644 tests/data/test155 create mode 100644 tests/data/test1550 create mode 100644 tests/data/test1551 create mode 100644 tests/data/test1552 create mode 100644 tests/data/test1553 create mode 100644 tests/data/test1554 create mode 100644 tests/data/test1555 create mode 100644 tests/data/test1556 create mode 100644 tests/data/test1557 create mode 100644 tests/data/test1558 create mode 100644 tests/data/test1559 create mode 100644 tests/data/test156 create mode 100644 tests/data/test1560 create mode 100644 tests/data/test1561 create mode 100644 tests/data/test1562 create mode 100644 tests/data/test1563 create mode 100644 tests/data/test1564 create mode 100644 tests/data/test1565 create mode 100644 tests/data/test157 create mode 100644 tests/data/test158 create mode 100644 tests/data/test159 create mode 100644 tests/data/test1590 create mode 100644 tests/data/test1591 create mode 100644 tests/data/test1592 create mode 100644 tests/data/test1593 create mode 100644 tests/data/test1594 create mode 100644 tests/data/test1595 create mode 100644 tests/data/test1596 create mode 100644 tests/data/test16 create mode 100644 tests/data/test160 create mode 100644 tests/data/test1600 create mode 100644 tests/data/test1601 create mode 100644 tests/data/test1602 create mode 100644 tests/data/test1603 create mode 100644 tests/data/test1604 create mode 100644 tests/data/test1605 create mode 100644 tests/data/test1606 create mode 100644 tests/data/test1607 create mode 100644 tests/data/test1608 create mode 100644 tests/data/test1609 create mode 100644 tests/data/test161 create mode 100644 tests/data/test1610 create mode 100644 tests/data/test1611 create mode 100644 tests/data/test1612 create mode 100644 tests/data/test162 create mode 100644 tests/data/test1620 create mode 100644 tests/data/test1621 create mode 100644 tests/data/test163 create mode 100644 tests/data/test164 create mode 100644 tests/data/test165 create mode 100644 tests/data/test1650 create mode 100644 tests/data/test1651 create mode 100644 tests/data/test1652 create mode 100644 tests/data/test1653 create mode 100644 tests/data/test1654 create mode 100644 tests/data/test1655 create mode 100644 tests/data/test166 create mode 100644 tests/data/test167 create mode 100644 tests/data/test168 create mode 100644 tests/data/test169 create mode 100644 tests/data/test17 create mode 100644 tests/data/test170 create mode 100644 tests/data/test1700 create mode 100644 tests/data/test1701 create mode 100644 tests/data/test1702 create mode 100644 tests/data/test171 create mode 100644 tests/data/test172 create mode 100644 tests/data/test173 create mode 100644 tests/data/test174 create mode 100644 tests/data/test175 create mode 100644 tests/data/test176 create mode 100644 tests/data/test177 create mode 100644 tests/data/test178 create mode 100644 tests/data/test179 create mode 100644 tests/data/test18 create mode 100644 tests/data/test180 create mode 100644 tests/data/test1800 create mode 100644 tests/data/test1801 create mode 100644 tests/data/test181 create mode 100644 tests/data/test182 create mode 100644 tests/data/test183 create mode 100644 tests/data/test184 create mode 100644 tests/data/test185 create mode 100644 tests/data/test186 create mode 100644 tests/data/test187 create mode 100644 tests/data/test188 create mode 100644 tests/data/test189 create mode 100644 tests/data/test19 create mode 100644 tests/data/test190 create mode 100644 tests/data/test1900 create mode 100644 tests/data/test1901 create mode 100644 tests/data/test1902 create mode 100644 tests/data/test1903 create mode 100644 tests/data/test1904 create mode 100644 tests/data/test1905 create mode 100644 tests/data/test1906 create mode 100644 tests/data/test1907 create mode 100644 tests/data/test1908 create mode 100644 tests/data/test191 create mode 100644 tests/data/test192 create mode 100644 tests/data/test193 create mode 100644 tests/data/test194 create mode 100644 tests/data/test195 create mode 100644 tests/data/test196 create mode 100644 tests/data/test197 create mode 100644 tests/data/test198 create mode 100644 tests/data/test199 create mode 100644 tests/data/test2 create mode 100644 tests/data/test20 create mode 100644 tests/data/test200 create mode 100644 tests/data/test2000 create mode 100644 tests/data/test2001 create mode 100644 tests/data/test2002 create mode 100644 tests/data/test2003 create mode 100644 tests/data/test2004 create mode 100644 tests/data/test2005 create mode 100644 tests/data/test2006 create mode 100644 tests/data/test2007 create mode 100644 tests/data/test2008 create mode 100644 tests/data/test2009 create mode 100644 tests/data/test201 create mode 100644 tests/data/test2010 create mode 100644 tests/data/test2011 create mode 100644 tests/data/test2012 create mode 100644 tests/data/test2013 create mode 100644 tests/data/test2014 create mode 100644 tests/data/test2015 create mode 100644 tests/data/test2016 create mode 100644 tests/data/test2017 create mode 100644 tests/data/test2018 create mode 100644 tests/data/test2019 create mode 100644 tests/data/test202 create mode 100644 tests/data/test2020 create mode 100644 tests/data/test2021 create mode 100644 tests/data/test2022 create mode 100644 tests/data/test2023 create mode 100644 tests/data/test2024 create mode 100644 tests/data/test2025 create mode 100644 tests/data/test2026 create mode 100644 tests/data/test2027 create mode 100644 tests/data/test2028 create mode 100644 tests/data/test2029 create mode 100644 tests/data/test203 create mode 100644 tests/data/test2030 create mode 100644 tests/data/test2031 create mode 100644 tests/data/test2032 create mode 100644 tests/data/test2033 create mode 100644 tests/data/test2034 create mode 100644 tests/data/test2035 create mode 100644 tests/data/test2036 create mode 100644 tests/data/test2037 create mode 100644 tests/data/test2038 create mode 100644 tests/data/test2039 create mode 100644 tests/data/test204 create mode 100644 tests/data/test2040 create mode 100644 tests/data/test2041 create mode 100644 tests/data/test2042 create mode 100644 tests/data/test2043 create mode 100644 tests/data/test2044 create mode 100644 tests/data/test2045 create mode 100644 tests/data/test2046 create mode 100644 tests/data/test2047 create mode 100644 tests/data/test2048 create mode 100644 tests/data/test2049 create mode 100644 tests/data/test205 create mode 100644 tests/data/test2050 create mode 100644 tests/data/test2051 create mode 100644 tests/data/test2052 create mode 100644 tests/data/test2053 create mode 100644 tests/data/test2054 create mode 100644 tests/data/test2055 create mode 100644 tests/data/test2056 create mode 100644 tests/data/test2057 create mode 100644 tests/data/test2058 create mode 100644 tests/data/test2059 create mode 100644 tests/data/test206 create mode 100644 tests/data/test2060 create mode 100644 tests/data/test2061 create mode 100644 tests/data/test2062 create mode 100644 tests/data/test2063 create mode 100644 tests/data/test2064 create mode 100644 tests/data/test2065 create mode 100644 tests/data/test2066 create mode 100644 tests/data/test2067 create mode 100644 tests/data/test2068 create mode 100644 tests/data/test2069 create mode 100644 tests/data/test207 create mode 100644 tests/data/test2071 create mode 100644 tests/data/test2072 create mode 100644 tests/data/test2073 create mode 100644 tests/data/test2074 create mode 100644 tests/data/test2075 create mode 100644 tests/data/test2076 create mode 100644 tests/data/test2077 create mode 100644 tests/data/test2078 create mode 100644 tests/data/test208 create mode 100644 tests/data/test2080 create mode 100644 tests/data/test209 create mode 100644 tests/data/test21 create mode 100644 tests/data/test210 create mode 100644 tests/data/test2100 create mode 100644 tests/data/test211 create mode 100644 tests/data/test212 create mode 100644 tests/data/test213 create mode 100644 tests/data/test214 create mode 100644 tests/data/test215 create mode 100644 tests/data/test216 create mode 100644 tests/data/test217 create mode 100644 tests/data/test218 create mode 100644 tests/data/test219 create mode 100644 tests/data/test22 create mode 100644 tests/data/test220 create mode 100644 tests/data/test221 create mode 100644 tests/data/test222 create mode 100644 tests/data/test223 create mode 100644 tests/data/test224 create mode 100644 tests/data/test225 create mode 100644 tests/data/test226 create mode 100644 tests/data/test227 create mode 100644 tests/data/test228 create mode 100644 tests/data/test229 create mode 100644 tests/data/test23 create mode 100644 tests/data/test230 create mode 100644 tests/data/test231 create mode 100644 tests/data/test232 create mode 100644 tests/data/test233 create mode 100644 tests/data/test234 create mode 100644 tests/data/test235 create mode 100644 tests/data/test236 create mode 100644 tests/data/test237 create mode 100644 tests/data/test238 create mode 100644 tests/data/test239 create mode 100644 tests/data/test24 create mode 100644 tests/data/test240 create mode 100644 tests/data/test241 create mode 100644 tests/data/test242 create mode 100644 tests/data/test243 create mode 100644 tests/data/test244 create mode 100644 tests/data/test245 create mode 100644 tests/data/test246 create mode 100644 tests/data/test247 create mode 100644 tests/data/test248 create mode 100644 tests/data/test249 create mode 100644 tests/data/test25 create mode 100644 tests/data/test250 create mode 100644 tests/data/test251 create mode 100644 tests/data/test252 create mode 100644 tests/data/test253 create mode 100644 tests/data/test254 create mode 100644 tests/data/test255 create mode 100644 tests/data/test256 create mode 100644 tests/data/test257 create mode 100644 tests/data/test258 create mode 100644 tests/data/test259 create mode 100644 tests/data/test26 create mode 100644 tests/data/test260 create mode 100644 tests/data/test261 create mode 100644 tests/data/test262 create mode 100644 tests/data/test263 create mode 100644 tests/data/test264 create mode 100644 tests/data/test265 create mode 100644 tests/data/test266 create mode 100644 tests/data/test267 create mode 100644 tests/data/test268 create mode 100644 tests/data/test269 create mode 100644 tests/data/test27 create mode 100644 tests/data/test270 create mode 100644 tests/data/test271 create mode 100644 tests/data/test272 create mode 100644 tests/data/test273 create mode 100644 tests/data/test274 create mode 100644 tests/data/test275 create mode 100644 tests/data/test276 create mode 100644 tests/data/test277 create mode 100644 tests/data/test278 create mode 100644 tests/data/test279 create mode 100644 tests/data/test28 create mode 100644 tests/data/test280 create mode 100644 tests/data/test281 create mode 100644 tests/data/test282 create mode 100644 tests/data/test283 create mode 100644 tests/data/test284 create mode 100644 tests/data/test285 create mode 100644 tests/data/test286 create mode 100644 tests/data/test287 create mode 100644 tests/data/test288 create mode 100644 tests/data/test289 create mode 100644 tests/data/test29 create mode 100644 tests/data/test290 create mode 100644 tests/data/test291 create mode 100644 tests/data/test292 create mode 100644 tests/data/test293 create mode 100644 tests/data/test294 create mode 100644 tests/data/test295 create mode 100644 tests/data/test296 create mode 100644 tests/data/test297 create mode 100644 tests/data/test298 create mode 100644 tests/data/test299 create mode 100644 tests/data/test3 create mode 100644 tests/data/test30 create mode 100644 tests/data/test300 create mode 100644 tests/data/test3000 create mode 100644 tests/data/test3001 create mode 100644 tests/data/test3002 create mode 100644 tests/data/test3003 create mode 100644 tests/data/test3004 create mode 100644 tests/data/test3005 create mode 100644 tests/data/test3006 create mode 100644 tests/data/test3007 create mode 100644 tests/data/test301 create mode 100644 tests/data/test302 create mode 100644 tests/data/test303 create mode 100644 tests/data/test304 create mode 100644 tests/data/test305 create mode 100644 tests/data/test306 create mode 100644 tests/data/test307 create mode 100644 tests/data/test308 create mode 100644 tests/data/test309 create mode 100644 tests/data/test31 create mode 100644 tests/data/test310 create mode 100644 tests/data/test311 create mode 100644 tests/data/test312 create mode 100644 tests/data/test313 create mode 100644 tests/data/test314 create mode 100644 tests/data/test315 create mode 100644 tests/data/test316 create mode 100644 tests/data/test317 create mode 100644 tests/data/test318 create mode 100644 tests/data/test319 create mode 100644 tests/data/test32 create mode 100644 tests/data/test320 create mode 100644 tests/data/test321 create mode 100644 tests/data/test322 create mode 100644 tests/data/test323 create mode 100644 tests/data/test324 create mode 100644 tests/data/test325 create mode 100644 tests/data/test326 create mode 100644 tests/data/test327 create mode 100644 tests/data/test328 create mode 100644 tests/data/test329 create mode 100644 tests/data/test33 create mode 100644 tests/data/test330 create mode 100644 tests/data/test331 create mode 100644 tests/data/test332 create mode 100644 tests/data/test333 create mode 100644 tests/data/test334 create mode 100644 tests/data/test335 create mode 100644 tests/data/test336 create mode 100644 tests/data/test337 create mode 100644 tests/data/test338 create mode 100644 tests/data/test339 create mode 100644 tests/data/test34 create mode 100644 tests/data/test340 create mode 100644 tests/data/test341 create mode 100644 tests/data/test342 create mode 100644 tests/data/test343 create mode 100644 tests/data/test35 create mode 100644 tests/data/test350 create mode 100644 tests/data/test351 create mode 100644 tests/data/test352 create mode 100644 tests/data/test353 create mode 100644 tests/data/test354 create mode 100644 tests/data/test355 create mode 100644 tests/data/test356 create mode 100644 tests/data/test357 create mode 100644 tests/data/test36 create mode 100644 tests/data/test37 create mode 100644 tests/data/test38 create mode 100644 tests/data/test39 create mode 100644 tests/data/test393 create mode 100644 tests/data/test394 create mode 100644 tests/data/test395 create mode 100644 tests/data/test4 create mode 100644 tests/data/test40 create mode 100644 tests/data/test400 create mode 100644 tests/data/test401 create mode 100644 tests/data/test402 create mode 100644 tests/data/test403 create mode 100644 tests/data/test404 create mode 100644 tests/data/test405 create mode 100644 tests/data/test406 create mode 100644 tests/data/test407 create mode 100644 tests/data/test408 create mode 100644 tests/data/test409 create mode 100644 tests/data/test41 create mode 100644 tests/data/test42 create mode 100644 tests/data/test43 create mode 100644 tests/data/test44 create mode 100644 tests/data/test45 create mode 100644 tests/data/test46 create mode 100644 tests/data/test47 create mode 100644 tests/data/test48 create mode 100644 tests/data/test49 create mode 100644 tests/data/test490 create mode 100644 tests/data/test491 create mode 100644 tests/data/test492 create mode 100644 tests/data/test5 create mode 100644 tests/data/test50 create mode 100644 tests/data/test500 create mode 100644 tests/data/test501 create mode 100644 tests/data/test502 create mode 100644 tests/data/test503 create mode 100644 tests/data/test504 create mode 100644 tests/data/test505 create mode 100644 tests/data/test506 create mode 100644 tests/data/test507 create mode 100644 tests/data/test508 create mode 100644 tests/data/test509 create mode 100644 tests/data/test51 create mode 100644 tests/data/test510 create mode 100644 tests/data/test511 create mode 100644 tests/data/test512 create mode 100644 tests/data/test513 create mode 100644 tests/data/test514 create mode 100644 tests/data/test515 create mode 100644 tests/data/test516 create mode 100644 tests/data/test517 create mode 100644 tests/data/test518 create mode 100644 tests/data/test519 create mode 100644 tests/data/test52 create mode 100644 tests/data/test520 create mode 100644 tests/data/test521 create mode 100644 tests/data/test522 create mode 100644 tests/data/test523 create mode 100644 tests/data/test524 create mode 100644 tests/data/test525 create mode 100644 tests/data/test526 create mode 100644 tests/data/test527 create mode 100644 tests/data/test528 create mode 100644 tests/data/test529 create mode 100644 tests/data/test53 create mode 100644 tests/data/test530 create mode 100644 tests/data/test531 create mode 100644 tests/data/test532 create mode 100644 tests/data/test533 create mode 100644 tests/data/test534 create mode 100644 tests/data/test535 create mode 100644 tests/data/test537 create mode 100644 tests/data/test538 create mode 100644 tests/data/test539 create mode 100644 tests/data/test54 create mode 100644 tests/data/test540 create mode 100644 tests/data/test541 create mode 100644 tests/data/test542 create mode 100644 tests/data/test543 create mode 100644 tests/data/test544 create mode 100644 tests/data/test545 create mode 100644 tests/data/test546 create mode 100644 tests/data/test547 create mode 100644 tests/data/test548 create mode 100644 tests/data/test549 create mode 100644 tests/data/test55 create mode 100644 tests/data/test550 create mode 100644 tests/data/test551 create mode 100644 tests/data/test552 create mode 100644 tests/data/test553 create mode 100644 tests/data/test554 create mode 100644 tests/data/test555 create mode 100644 tests/data/test556 create mode 100644 tests/data/test557 create mode 100644 tests/data/test558 create mode 100644 tests/data/test559 create mode 100644 tests/data/test56 create mode 100644 tests/data/test560 create mode 100644 tests/data/test561 create mode 100644 tests/data/test562 create mode 100644 tests/data/test563 create mode 100644 tests/data/test564 create mode 100644 tests/data/test565 create mode 100644 tests/data/test566 create mode 100644 tests/data/test567 create mode 100644 tests/data/test568 create mode 100644 tests/data/test569 create mode 100644 tests/data/test57 create mode 100644 tests/data/test570 create mode 100644 tests/data/test571 create mode 100644 tests/data/test572 create mode 100644 tests/data/test573 create mode 100644 tests/data/test574 create mode 100644 tests/data/test575 create mode 100644 tests/data/test576 create mode 100644 tests/data/test577 create mode 100644 tests/data/test578 create mode 100644 tests/data/test579 create mode 100644 tests/data/test58 create mode 100644 tests/data/test580 create mode 100644 tests/data/test581 create mode 100644 tests/data/test582 create mode 100644 tests/data/test583 create mode 100644 tests/data/test584 create mode 100644 tests/data/test585 create mode 100644 tests/data/test586 create mode 100644 tests/data/test587 create mode 100644 tests/data/test588 create mode 100644 tests/data/test589 create mode 100644 tests/data/test59 create mode 100644 tests/data/test590 create mode 100644 tests/data/test591 create mode 100644 tests/data/test592 create mode 100644 tests/data/test593 create mode 100644 tests/data/test594 create mode 100644 tests/data/test595 create mode 100644 tests/data/test596 create mode 100644 tests/data/test597 create mode 100644 tests/data/test598 create mode 100644 tests/data/test599 create mode 100644 tests/data/test6 create mode 100644 tests/data/test60 create mode 100644 tests/data/test600 create mode 100644 tests/data/test601 create mode 100644 tests/data/test602 create mode 100644 tests/data/test603 create mode 100644 tests/data/test604 create mode 100644 tests/data/test605 create mode 100644 tests/data/test606 create mode 100644 tests/data/test607 create mode 100644 tests/data/test608 create mode 100644 tests/data/test609 create mode 100644 tests/data/test61 create mode 100644 tests/data/test610 create mode 100644 tests/data/test611 create mode 100644 tests/data/test612 create mode 100644 tests/data/test613 create mode 100644 tests/data/test614 create mode 100644 tests/data/test615 create mode 100644 tests/data/test616 create mode 100644 tests/data/test617 create mode 100644 tests/data/test618 create mode 100644 tests/data/test619 create mode 100644 tests/data/test62 create mode 100644 tests/data/test620 create mode 100644 tests/data/test621 create mode 100644 tests/data/test622 create mode 100644 tests/data/test623 create mode 100644 tests/data/test624 create mode 100644 tests/data/test625 create mode 100644 tests/data/test626 create mode 100644 tests/data/test627 create mode 100644 tests/data/test628 create mode 100644 tests/data/test629 create mode 100644 tests/data/test63 create mode 100644 tests/data/test630 create mode 100644 tests/data/test631 create mode 100644 tests/data/test632 create mode 100644 tests/data/test633 create mode 100644 tests/data/test634 create mode 100644 tests/data/test635 create mode 100644 tests/data/test636 create mode 100644 tests/data/test637 create mode 100644 tests/data/test638 create mode 100644 tests/data/test639 create mode 100644 tests/data/test64 create mode 100644 tests/data/test640 create mode 100644 tests/data/test641 create mode 100644 tests/data/test642 create mode 100644 tests/data/test643 create mode 100644 tests/data/test644 create mode 100644 tests/data/test645 create mode 100644 tests/data/test646 create mode 100644 tests/data/test647 create mode 100644 tests/data/test648 create mode 100644 tests/data/test649 create mode 100644 tests/data/test65 create mode 100644 tests/data/test650 create mode 100644 tests/data/test651 create mode 100644 tests/data/test652 create mode 100644 tests/data/test653 create mode 100644 tests/data/test654 create mode 100644 tests/data/test655 create mode 100644 tests/data/test656 create mode 100644 tests/data/test658 create mode 100644 tests/data/test659 create mode 100644 tests/data/test66 create mode 100644 tests/data/test660 create mode 100644 tests/data/test661 create mode 100644 tests/data/test662 create mode 100644 tests/data/test663 create mode 100644 tests/data/test664 create mode 100644 tests/data/test665 create mode 100644 tests/data/test666 create mode 100644 tests/data/test667 create mode 100644 tests/data/test668 create mode 100644 tests/data/test67 create mode 100644 tests/data/test670 create mode 100644 tests/data/test671 create mode 100644 tests/data/test672 create mode 100644 tests/data/test673 create mode 100644 tests/data/test68 create mode 100644 tests/data/test69 create mode 100644 tests/data/test7 create mode 100644 tests/data/test70 create mode 100644 tests/data/test700 create mode 100644 tests/data/test701 create mode 100644 tests/data/test702 create mode 100644 tests/data/test703 create mode 100644 tests/data/test704 create mode 100644 tests/data/test705 create mode 100644 tests/data/test706 create mode 100644 tests/data/test707 create mode 100644 tests/data/test708 create mode 100644 tests/data/test709 create mode 100644 tests/data/test71 create mode 100644 tests/data/test710 create mode 100644 tests/data/test711 create mode 100644 tests/data/test712 create mode 100644 tests/data/test713 create mode 100644 tests/data/test714 create mode 100644 tests/data/test715 create mode 100644 tests/data/test716 create mode 100644 tests/data/test717 create mode 100644 tests/data/test72 create mode 100644 tests/data/test73 create mode 100644 tests/data/test74 create mode 100644 tests/data/test75 create mode 100644 tests/data/test76 create mode 100644 tests/data/test77 create mode 100644 tests/data/test78 create mode 100644 tests/data/test79 create mode 100644 tests/data/test8 create mode 100644 tests/data/test80 create mode 100644 tests/data/test800 create mode 100644 tests/data/test801 create mode 100644 tests/data/test802 create mode 100644 tests/data/test803 create mode 100644 tests/data/test804 create mode 100644 tests/data/test805 create mode 100644 tests/data/test806 create mode 100644 tests/data/test807 create mode 100644 tests/data/test808 create mode 100644 tests/data/test809 create mode 100644 tests/data/test81 create mode 100644 tests/data/test810 create mode 100644 tests/data/test811 create mode 100644 tests/data/test812 create mode 100644 tests/data/test813 create mode 100644 tests/data/test814 create mode 100644 tests/data/test815 create mode 100644 tests/data/test816 create mode 100644 tests/data/test817 create mode 100644 tests/data/test818 create mode 100644 tests/data/test819 create mode 100644 tests/data/test82 create mode 100644 tests/data/test820 create mode 100644 tests/data/test821 create mode 100644 tests/data/test822 create mode 100644 tests/data/test823 create mode 100644 tests/data/test824 create mode 100644 tests/data/test825 create mode 100644 tests/data/test826 create mode 100644 tests/data/test827 create mode 100644 tests/data/test828 create mode 100644 tests/data/test829 create mode 100644 tests/data/test83 create mode 100644 tests/data/test830 create mode 100644 tests/data/test831 create mode 100644 tests/data/test832 create mode 100644 tests/data/test833 create mode 100644 tests/data/test834 create mode 100644 tests/data/test835 create mode 100644 tests/data/test836 create mode 100644 tests/data/test837 create mode 100644 tests/data/test838 create mode 100644 tests/data/test839 create mode 100644 tests/data/test84 create mode 100644 tests/data/test840 create mode 100644 tests/data/test841 create mode 100644 tests/data/test842 create mode 100644 tests/data/test843 create mode 100644 tests/data/test844 create mode 100644 tests/data/test845 create mode 100644 tests/data/test846 create mode 100644 tests/data/test847 create mode 100644 tests/data/test848 create mode 100644 tests/data/test849 create mode 100644 tests/data/test85 create mode 100644 tests/data/test850 create mode 100644 tests/data/test851 create mode 100644 tests/data/test852 create mode 100644 tests/data/test853 create mode 100644 tests/data/test854 create mode 100644 tests/data/test855 create mode 100644 tests/data/test856 create mode 100644 tests/data/test857 create mode 100644 tests/data/test858 create mode 100644 tests/data/test859 create mode 100644 tests/data/test86 create mode 100644 tests/data/test860 create mode 100644 tests/data/test861 create mode 100644 tests/data/test862 create mode 100644 tests/data/test863 create mode 100644 tests/data/test864 create mode 100644 tests/data/test865 create mode 100644 tests/data/test866 create mode 100644 tests/data/test867 create mode 100644 tests/data/test868 create mode 100644 tests/data/test869 create mode 100644 tests/data/test87 create mode 100644 tests/data/test870 create mode 100644 tests/data/test871 create mode 100644 tests/data/test872 create mode 100644 tests/data/test873 create mode 100644 tests/data/test874 create mode 100644 tests/data/test875 create mode 100644 tests/data/test876 create mode 100644 tests/data/test877 create mode 100644 tests/data/test878 create mode 100644 tests/data/test879 create mode 100644 tests/data/test88 create mode 100644 tests/data/test880 create mode 100644 tests/data/test881 create mode 100644 tests/data/test882 create mode 100644 tests/data/test883 create mode 100644 tests/data/test884 create mode 100644 tests/data/test885 create mode 100644 tests/data/test886 create mode 100644 tests/data/test887 create mode 100644 tests/data/test888 create mode 100644 tests/data/test889 create mode 100644 tests/data/test89 create mode 100644 tests/data/test890 create mode 100644 tests/data/test891 create mode 100644 tests/data/test892 create mode 100644 tests/data/test893 create mode 100644 tests/data/test894 create mode 100644 tests/data/test9 create mode 100644 tests/data/test90 create mode 100644 tests/data/test900 create mode 100644 tests/data/test901 create mode 100644 tests/data/test902 create mode 100644 tests/data/test903 create mode 100644 tests/data/test904 create mode 100644 tests/data/test905 create mode 100644 tests/data/test906 create mode 100644 tests/data/test907 create mode 100644 tests/data/test908 create mode 100644 tests/data/test909 create mode 100644 tests/data/test91 create mode 100644 tests/data/test910 create mode 100644 tests/data/test911 create mode 100644 tests/data/test912 create mode 100644 tests/data/test913 create mode 100644 tests/data/test914 create mode 100644 tests/data/test915 create mode 100644 tests/data/test916 create mode 100644 tests/data/test917 create mode 100644 tests/data/test918 create mode 100644 tests/data/test919 create mode 100644 tests/data/test92 create mode 100644 tests/data/test920 create mode 100644 tests/data/test921 create mode 100644 tests/data/test922 create mode 100644 tests/data/test923 create mode 100644 tests/data/test924 create mode 100644 tests/data/test925 create mode 100644 tests/data/test926 create mode 100644 tests/data/test927 create mode 100644 tests/data/test928 create mode 100644 tests/data/test929 create mode 100644 tests/data/test93 create mode 100644 tests/data/test930 create mode 100644 tests/data/test931 create mode 100644 tests/data/test932 create mode 100644 tests/data/test933 create mode 100644 tests/data/test934 create mode 100644 tests/data/test935 create mode 100644 tests/data/test936 create mode 100644 tests/data/test937 create mode 100644 tests/data/test938 create mode 100644 tests/data/test939 create mode 100644 tests/data/test94 create mode 100644 tests/data/test940 create mode 100644 tests/data/test941 create mode 100644 tests/data/test942 create mode 100644 tests/data/test943 create mode 100644 tests/data/test944 create mode 100644 tests/data/test945 create mode 100644 tests/data/test946 create mode 100644 tests/data/test947 create mode 100644 tests/data/test948 create mode 100644 tests/data/test949 create mode 100644 tests/data/test95 create mode 100644 tests/data/test950 create mode 100644 tests/data/test951 create mode 100644 tests/data/test952 create mode 100644 tests/data/test953 create mode 100644 tests/data/test954 create mode 100644 tests/data/test955 create mode 100644 tests/data/test956 create mode 100644 tests/data/test957 create mode 100644 tests/data/test958 create mode 100644 tests/data/test959 create mode 100644 tests/data/test96 create mode 100644 tests/data/test960 create mode 100644 tests/data/test961 create mode 100644 tests/data/test962 create mode 100644 tests/data/test963 create mode 100644 tests/data/test964 create mode 100644 tests/data/test965 create mode 100644 tests/data/test966 create mode 100644 tests/data/test967 create mode 100644 tests/data/test968 create mode 100644 tests/data/test969 create mode 100644 tests/data/test97 create mode 100644 tests/data/test98 create mode 100644 tests/data/test99 create mode 100755 tests/dictserver.py create mode 100644 tests/directories.pm create mode 100755 tests/disable-scan.pl create mode 100644 tests/error-codes.pl create mode 100755 tests/extern-scan.pl create mode 100644 tests/ftp.pm create mode 100755 tests/ftpserver.pl create mode 100644 tests/fuzz/README create mode 100755 tests/fuzz/download_fuzzer.sh create mode 100644 tests/getpart.pm create mode 100755 tests/http2-server.pl create mode 100755 tests/httpserver.pl create mode 100755 tests/keywords.pl create mode 100644 tests/libtest/.gitignore create mode 100644 tests/libtest/CMakeLists.txt create mode 100644 tests/libtest/Makefile.am create mode 100644 tests/libtest/Makefile.inc create mode 100644 tests/libtest/chkdecimalpoint.c create mode 100644 tests/libtest/chkhostname.c create mode 100644 tests/libtest/first.c create mode 100644 tests/libtest/lib1156.c create mode 100644 tests/libtest/lib1500.c create mode 100644 tests/libtest/lib1501.c create mode 100644 tests/libtest/lib1502.c create mode 100644 tests/libtest/lib1506.c create mode 100644 tests/libtest/lib1507.c create mode 100644 tests/libtest/lib1508.c create mode 100644 tests/libtest/lib1509.c create mode 100644 tests/libtest/lib1510.c create mode 100644 tests/libtest/lib1511.c create mode 100644 tests/libtest/lib1512.c create mode 100644 tests/libtest/lib1513.c create mode 100644 tests/libtest/lib1514.c create mode 100644 tests/libtest/lib1515.c create mode 100644 tests/libtest/lib1517.c create mode 100644 tests/libtest/lib1518.c create mode 100644 tests/libtest/lib1520.c create mode 100644 tests/libtest/lib1522.c create mode 100644 tests/libtest/lib1523.c create mode 100644 tests/libtest/lib1525.c create mode 100644 tests/libtest/lib1526.c create mode 100644 tests/libtest/lib1527.c create mode 100644 tests/libtest/lib1528.c create mode 100644 tests/libtest/lib1529.c create mode 100644 tests/libtest/lib1530.c create mode 100644 tests/libtest/lib1531.c create mode 100644 tests/libtest/lib1532.c create mode 100644 tests/libtest/lib1533.c create mode 100644 tests/libtest/lib1534.c create mode 100644 tests/libtest/lib1535.c create mode 100644 tests/libtest/lib1536.c create mode 100644 tests/libtest/lib1537.c create mode 100644 tests/libtest/lib1538.c create mode 100644 tests/libtest/lib1540.c create mode 100644 tests/libtest/lib1541.c create mode 100644 tests/libtest/lib1550.c create mode 100644 tests/libtest/lib1551.c create mode 100644 tests/libtest/lib1552.c create mode 100644 tests/libtest/lib1553.c create mode 100644 tests/libtest/lib1554.c create mode 100644 tests/libtest/lib1555.c create mode 100644 tests/libtest/lib1556.c create mode 100644 tests/libtest/lib1557.c create mode 100644 tests/libtest/lib1558.c create mode 100644 tests/libtest/lib1559.c create mode 100644 tests/libtest/lib1560.c create mode 100644 tests/libtest/lib1564.c create mode 100644 tests/libtest/lib1565.c create mode 100644 tests/libtest/lib1591.c create mode 100644 tests/libtest/lib1592.c create mode 100644 tests/libtest/lib1593.c create mode 100644 tests/libtest/lib1594.c create mode 100644 tests/libtest/lib1900.c create mode 100644 tests/libtest/lib1905.c create mode 100644 tests/libtest/lib1906.c create mode 100644 tests/libtest/lib1907.c create mode 100644 tests/libtest/lib1908.c create mode 100644 tests/libtest/lib500.c create mode 100644 tests/libtest/lib501.c create mode 100644 tests/libtest/lib502.c create mode 100644 tests/libtest/lib503.c create mode 100644 tests/libtest/lib504.c create mode 100644 tests/libtest/lib505.c create mode 100644 tests/libtest/lib506.c create mode 100644 tests/libtest/lib507.c create mode 100644 tests/libtest/lib508.c create mode 100644 tests/libtest/lib509.c create mode 100644 tests/libtest/lib510.c create mode 100644 tests/libtest/lib511.c create mode 100644 tests/libtest/lib512.c create mode 100644 tests/libtest/lib513.c create mode 100644 tests/libtest/lib514.c create mode 100644 tests/libtest/lib515.c create mode 100644 tests/libtest/lib516.c create mode 100644 tests/libtest/lib517.c create mode 100644 tests/libtest/lib518.c create mode 100644 tests/libtest/lib519.c create mode 100644 tests/libtest/lib520.c create mode 100644 tests/libtest/lib521.c create mode 100644 tests/libtest/lib523.c create mode 100644 tests/libtest/lib524.c create mode 100644 tests/libtest/lib525.c create mode 100644 tests/libtest/lib526.c create mode 100644 tests/libtest/lib530.c create mode 100644 tests/libtest/lib533.c create mode 100644 tests/libtest/lib537.c create mode 100644 tests/libtest/lib539.c create mode 100644 tests/libtest/lib540.c create mode 100644 tests/libtest/lib541.c create mode 100644 tests/libtest/lib542.c create mode 100644 tests/libtest/lib543.c create mode 100644 tests/libtest/lib544.c create mode 100644 tests/libtest/lib547.c create mode 100644 tests/libtest/lib549.c create mode 100644 tests/libtest/lib552.c create mode 100644 tests/libtest/lib553.c create mode 100644 tests/libtest/lib554.c create mode 100644 tests/libtest/lib555.c create mode 100644 tests/libtest/lib556.c create mode 100644 tests/libtest/lib557.c create mode 100644 tests/libtest/lib558.c create mode 100644 tests/libtest/lib559.c create mode 100644 tests/libtest/lib560.c create mode 100644 tests/libtest/lib562.c create mode 100644 tests/libtest/lib564.c create mode 100644 tests/libtest/lib566.c create mode 100644 tests/libtest/lib567.c create mode 100644 tests/libtest/lib568.c create mode 100644 tests/libtest/lib569.c create mode 100644 tests/libtest/lib570.c create mode 100644 tests/libtest/lib571.c create mode 100644 tests/libtest/lib572.c create mode 100644 tests/libtest/lib573.c create mode 100644 tests/libtest/lib574.c create mode 100644 tests/libtest/lib575.c create mode 100644 tests/libtest/lib576.c create mode 100644 tests/libtest/lib578.c create mode 100644 tests/libtest/lib579.c create mode 100644 tests/libtest/lib582.c create mode 100644 tests/libtest/lib583.c create mode 100644 tests/libtest/lib586.c create mode 100644 tests/libtest/lib589.c create mode 100644 tests/libtest/lib590.c create mode 100644 tests/libtest/lib591.c create mode 100644 tests/libtest/lib597.c create mode 100644 tests/libtest/lib598.c create mode 100644 tests/libtest/lib599.c create mode 100644 tests/libtest/lib643.c create mode 100644 tests/libtest/lib650.c create mode 100644 tests/libtest/lib651.c create mode 100644 tests/libtest/lib652.c create mode 100644 tests/libtest/lib653.c create mode 100644 tests/libtest/lib654.c create mode 100644 tests/libtest/lib655.c create mode 100644 tests/libtest/lib658.c create mode 100644 tests/libtest/lib659.c create mode 100644 tests/libtest/lib661.c create mode 100644 tests/libtest/lib666.c create mode 100644 tests/libtest/lib667.c create mode 100644 tests/libtest/lib668.c create mode 100644 tests/libtest/lib670.c create mode 100644 tests/libtest/libauthretry.c create mode 100644 tests/libtest/libntlmconnect.c create mode 100755 tests/libtest/mk-lib1521.pl create mode 100755 tests/libtest/notexists.pl create mode 100644 tests/libtest/sethostname.c create mode 100644 tests/libtest/sethostname.h create mode 100644 tests/libtest/stub_gssapi.c create mode 100644 tests/libtest/stub_gssapi.h create mode 100644 tests/libtest/test.h create mode 100755 tests/libtest/test1013.pl create mode 100755 tests/libtest/test1022.pl create mode 100755 tests/libtest/test307.pl create mode 100755 tests/libtest/test610.pl create mode 100755 tests/libtest/test613.pl create mode 100755 tests/libtest/test75.pl create mode 100644 tests/libtest/testtrace.c create mode 100644 tests/libtest/testtrace.h create mode 100644 tests/libtest/testutil.c create mode 100644 tests/libtest/testutil.h create mode 100755 tests/manpage-scan.pl create mode 100644 tests/manpage-syntax.pl create mode 100755 tests/mem-include-scan.pl create mode 100755 tests/memanalyze.pl create mode 100755 tests/negtelnetserver.py create mode 100755 tests/nroff-scan.pl create mode 100755 tests/objnames-test08.sh create mode 100755 tests/objnames-test10.sh create mode 100644 tests/objnames.inc create mode 100644 tests/pathhelp.pm create mode 100644 tests/python_dependencies/impacket/LICENSE create mode 100644 tests/python_dependencies/impacket/__init__.py create mode 100644 tests/python_dependencies/impacket/nmb.py create mode 100644 tests/python_dependencies/impacket/nt_errors.py create mode 100644 tests/python_dependencies/impacket/ntlm.py create mode 100644 tests/python_dependencies/impacket/smb.py create mode 100644 tests/python_dependencies/impacket/smb3.py create mode 100644 tests/python_dependencies/impacket/smb3structs.py create mode 100644 tests/python_dependencies/impacket/smbserver.py create mode 100644 tests/python_dependencies/impacket/spnego.py create mode 100644 tests/python_dependencies/impacket/structure.py create mode 100644 tests/python_dependencies/impacket/uuid.py create mode 100644 tests/python_dependencies/impacket/version.py create mode 100755 tests/rtspserver.pl create mode 100644 tests/runtests.1 create mode 100755 tests/runtests.pl create mode 100755 tests/secureserver.pl create mode 100644 tests/server/.gitignore create mode 100644 tests/server/CMakeLists.txt create mode 100644 tests/server/Makefile.am create mode 100644 tests/server/Makefile.inc create mode 100755 tests/server/base64.pl create mode 100644 tests/server/disabled.c create mode 100644 tests/server/fake_ntlm.c create mode 100644 tests/server/getpart.c create mode 100644 tests/server/getpart.h create mode 100644 tests/server/resolve.c create mode 100644 tests/server/rtspd.c create mode 100644 tests/server/server_setup.h create mode 100644 tests/server/server_sockaddr.h create mode 100644 tests/server/sockfilt.c create mode 100644 tests/server/socksd.c create mode 100644 tests/server/sws.c create mode 100644 tests/server/testpart.c create mode 100644 tests/server/tftp.h create mode 100644 tests/server/tftpd.c create mode 100644 tests/server/util.c create mode 100644 tests/server/util.h create mode 100644 tests/serverhelp.pm create mode 100755 tests/smbserver.py create mode 100644 tests/sshhelp.pm create mode 100644 tests/sshserver.pl create mode 100644 tests/stunnel.pem create mode 100755 tests/symbol-scan.pl create mode 100644 tests/testcurl.1 create mode 100755 tests/testcurl.pl create mode 100755 tests/tftpserver.pl create mode 100644 tests/unit/.gitignore create mode 100644 tests/unit/CMakeLists.txt create mode 100644 tests/unit/Makefile.am create mode 100644 tests/unit/Makefile.inc create mode 100644 tests/unit/README create mode 100644 tests/unit/curlcheck.h create mode 100644 tests/unit/unit1300.c create mode 100644 tests/unit/unit1301.c create mode 100644 tests/unit/unit1302.c create mode 100644 tests/unit/unit1303.c create mode 100644 tests/unit/unit1304.c create mode 100644 tests/unit/unit1305.c create mode 100644 tests/unit/unit1307.c create mode 100644 tests/unit/unit1308.c create mode 100644 tests/unit/unit1309.c create mode 100644 tests/unit/unit1323.c create mode 100644 tests/unit/unit1330.c create mode 100644 tests/unit/unit1394.c create mode 100644 tests/unit/unit1395.c create mode 100644 tests/unit/unit1396.c create mode 100644 tests/unit/unit1397.c create mode 100644 tests/unit/unit1398.c create mode 100644 tests/unit/unit1399.c create mode 100644 tests/unit/unit1600.c create mode 100644 tests/unit/unit1601.c create mode 100644 tests/unit/unit1602.c create mode 100644 tests/unit/unit1603.c create mode 100644 tests/unit/unit1604.c create mode 100644 tests/unit/unit1605.c create mode 100644 tests/unit/unit1606.c create mode 100644 tests/unit/unit1607.c create mode 100644 tests/unit/unit1608.c create mode 100644 tests/unit/unit1609.c create mode 100644 tests/unit/unit1610.c create mode 100644 tests/unit/unit1611.c create mode 100644 tests/unit/unit1612.c create mode 100644 tests/unit/unit1620.c create mode 100644 tests/unit/unit1621.c create mode 100644 tests/unit/unit1650.c create mode 100644 tests/unit/unit1651.c create mode 100644 tests/unit/unit1652.c create mode 100644 tests/unit/unit1653.c create mode 100644 tests/unit/unit1654.c create mode 100644 tests/unit/unit1655.c create mode 100644 tests/valgrind.pm create mode 100644 tests/valgrind.supp create mode 100644 winbuild/.gitignore create mode 100644 winbuild/BUILD.WINDOWS.txt create mode 100644 winbuild/Makefile.vc create mode 100644 winbuild/MakefileBuild.vc create mode 100755 winbuild/gen_resp_file.bat create mode 100644 winbuild/makedebug.cmd create mode 100644 winbuild/rundebug.cmd diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml new file mode 100644 index 0000000000..9e2d74e993 --- /dev/null +++ b/.azure-pipelines.yml @@ -0,0 +1,428 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: +- 'master' +- '*/ci' + +stages: + +########################################## +### Linux jobs first +########################################## + +- stage: linux + dependsOn: [] + jobs: + - job: vanilla + displayName: ubuntu default + timeoutInMinutes: 20 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: ./buildconf && ./configure --enable-debug --enable-werror + displayName: 'configure debug' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: disable_ipv6 + displayName: ubuntu w/o IPv6 + timeoutInMinutes: 20 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: ./buildconf && ./configure --disable-ipv6 + displayName: 'configure disable ipv6' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: disable_http_smtp_imap + displayName: ubuntu w/o HTTP/SMTP/IMAP + timeoutInMinutes: 20 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: ./buildconf && ./configure --disable-http --disable-smtp --disable-imap + displayName: 'configure disable http/smtp/imap' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: disable_thredres + displayName: ubuntu sync resolver + timeoutInMinutes: 20 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: ./buildconf && ./configure --disable-threaded-resolver + displayName: 'configure disable threaded-resolver' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: http_only + displayName: ubuntu HTTP only + timeoutInMinutes: 20 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: ./buildconf && ./configure --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-ldap --disable-pop3 --disable-rtmp --disable-rtsp --disable-scp --disable-sftp --disable-smb --disable-smtp --disable-telnet --disable-tftp + displayName: 'configure disable non-http' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + +- stage: linux_torture + dependsOn: linux + jobs: + - job: torture + displayName: ubuntu torture tests + timeoutInMinutes: 50 + pool: + vmImage: 'ubuntu-latest' + steps: + - script: sudo apt install libnghttp2-dev + displayName: 'apt install' + + - script: ./buildconf && ./configure --enable-debug --disable-shared --disable-threaded-resolver --enable-alt-svc + displayName: 'configure torture' + + - script: make + displayName: 'make' + + - script: make "TFLAGS=-n -t --shallow=40 '!FTP'" test-nonflaky + displayName: 'torture test' + +########################################## +### macOS jobs below +########################################## + +- stage: macos + dependsOn: [] + jobs: + - job: macos_vanilla + displayName: macos default + timeoutInMinutes: 30 + pool: + vmImage: 'macOS-latest' + steps: + - script: brew update && brew install libtool autoconf automake nghttp2 pkg-config + displayName: 'brew install' + + - script: ./buildconf && ./configure --enable-debug --enable-werror --without-brotli + displayName: 'configure debug without brotli' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: macos_libssh2 + displayName: macos libssh2 + timeoutInMinutes: 30 + pool: + vmImage: 'macOS-latest' + steps: + - script: brew update && brew install libtool autoconf automake nghttp2 pkg-config libssh2 + displayName: 'brew install' + + - script: ./buildconf && ./configure --enable-debug --with-libssh2 + displayName: 'configure debug with libssh2' + + - script: make + displayName: 'make' + + - script: make test-nonflaky + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: macos_cmake + displayName: macos cmake openssl + timeoutInMinutes: 20 + pool: + vmImage: 'macOS-latest' + steps: + - script: brew update && brew install libtool autoconf automake nghttp2 pkg-config openssl + displayName: 'brew install' + + - script: cmake -H. -Bbuild -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DCURL_DISABLE_LDAP=ON -DCURL_DISABLE_LDAPS=ON && cmake --build build + displayName: 'cmake build' + +- stage: macos_torture + dependsOn: macos + jobs: + - job: macos_torture + displayName: macos torture + timeoutInMinutes: 50 + pool: + vmImage: 'macOS-latest' + steps: + - script: brew update && brew install libtool autoconf automake nghttp2 pkg-config + displayName: 'brew install' + + - script: ./buildconf && ./configure --enable-debug --disable-shared --disable-threaded-resolver --enable-alt-svc + displayName: 'configure torture' + + - script: make + displayName: 'make' + + - script: make "TFLAGS=-n -t --shallow=25 '!FTP'" test-nonflaky + displayName: 'torture test' + +########################################## +### Windows jobs below +########################################## + +- stage: windows + dependsOn: [] + jobs: + - job: windows_msys2_mingw32_debug_openssl + displayName: msys2 mingw32 debug openssl + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys2-mingw32:ltsc2019 + env: + MSYSTEM: MINGW32 + MSYS2_PATH_TYPE: inherit + TFLAGS: "~323 ~1056 ~1299" + steps: + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --enable-debug --enable-werror" + displayName: 'configure debug' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys2_mingw64_debug_openssl + displayName: msys2 mingw64 debug openssl + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys2-mingw64:ltsc2019 + env: + MSYSTEM: MINGW64 + MSYS2_PATH_TYPE: inherit + TFLAGS: "~323 ~1056 ~1299" + steps: + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --enable-debug --enable-werror" + displayName: 'configure debug' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw_debug_openssl + displayName: msys1 mingw debug openssl + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw:ltsc2019 + env: + TFLAGS: "~203 ~1056 ~1143" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/mingw --enable-debug" + displayName: 'configure debug' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw32_debug_openssl + displayName: msys1 mingw32 debug openssl + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw32:ltsc2019 + env: + TFLAGS: "~203 ~1056 ~1143 ~1299" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --prefix=/mingw32 --enable-debug --enable-werror --without-zlib" + displayName: 'configure debug without zlib' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw64_debug_openssl + displayName: msys1 mingw64 debug openssl + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw64:ltsc2019 + env: + TFLAGS: "~203 ~1056 ~1143 ~1299" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --prefix=/mingw64 --enable-debug --enable-werror --without-zlib" + displayName: 'configure debug without zlib' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys2_mingw32_debug_schannel + displayName: msys2 mingw32 debug schannel + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys2-mingw32:ltsc2019 + env: + MSYSTEM: MINGW32 + MSYS2_PATH_TYPE: inherit + TFLAGS: "~165 ~310 ~1013 ~1056 ~1299 ~1448 ~2034 ~2037 ~2041 ~2046 ~2047 ~3000 ~3001" + steps: + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --enable-debug --enable-werror --enable-sspi --without-ssl --with-schannel --with-winidn" + displayName: 'configure debug with sspi/schannel/winidn' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys2_mingw64_debug_schannel + displayName: msys2 mingw64 debug schannel + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys2-mingw64:ltsc2019 + env: + MSYSTEM: MINGW64 + MSYS2_PATH_TYPE: inherit + TFLAGS: "~165 ~310 ~1013 ~1056 ~1299 ~1448 ~2034 ~2037 ~2041 ~2046 ~2047 ~3000 ~3001" + steps: + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --enable-debug --enable-werror --enable-sspi --without-ssl --with-schannel --with-winidn" + displayName: 'configure debug with sspi/schannel/winidn' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\msys64\usr\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw_debug_schannel + displayName: msys1 mingw debug schannel + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw:ltsc2019 + env: + TFLAGS: "~203 ~305 ~310 ~311 ~312 ~313 ~404 ~1013 ~1056 ~1143 ~2034 ~2035 ~2037 ~2038 ~2041 ~2042 ~2048 ~3000 ~3001" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/mingw --enable-debug --enable-sspi --without-ssl --with-schannel --with-winidn" + displayName: 'configure debug with sspi/schannel/winidn' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw32_debug_schannel + displayName: msys1 mingw32 debug schannel + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw32:ltsc2019 + env: + TFLAGS: "~203 ~310 ~1013 ~1056 ~1143 ~1299 ~2034 ~2037 ~2041 ~3000 ~3001" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --prefix=/mingw32 --enable-debug --enable-werror --enable-sspi --without-ssl --with-schannel --with-winidn --without-zlib" + displayName: 'configure debug with sspi/schannel/winidn without zlib' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" + + - job: windows_msys1_mingw64_debug_schannel + displayName: msys1 mingw64 debug schannel + timeoutInMinutes: 70 + pool: + vmImage: 'windows-2019' + container: + image: mback2k/curl-docker-winbuildenv-msys1-mingw64:ltsc2019 + env: + TFLAGS: "~203 ~310 ~1013 ~1056 ~1143 ~1299 ~2034 ~2037 ~2041 ~3000 ~3001" + steps: + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && ./buildconf && ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --prefix=/mingw64 --enable-debug --enable-werror --enable-sspi --without-ssl --with-schannel --with-winidn --without-zlib" + displayName: 'configure debug with sspi/schannel/winidn without zlib' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make" + displayName: 'make' + + - script: C:\MinGW\msys\1.0\bin\sh -l -c "cd $(echo '%cd%') && make test-nonflaky" + displayName: 'test' + env: + AZURE_ACCESS_TOKEN: "$(System.AccessToken)" diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 0000000000..5bf6b35a48 --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,53 @@ +# Cirrus CI configuration +# https://cirrus-ci.com/github/curl/curl + +task: + name: FreeBSD + freebsd_instance: + matrix: + # A stable 13.0 image likely won't be available before early 2021 + # image_family: freebsd-13-0-snap + image_family: freebsd-12-1 + # The stable 11.3 image causes "Agent is not responding" so use a snapshot + image_family: freebsd-11-3-snap + + env: + CIRRUS_CLONE_DEPTH: 10 + MAKE_FLAGS: -j 2 + + pkginstall_script: + - pkg install -y autoconf automake libtool pkgconf brotli openldap-client heimdal libpsl libmetalink libssh2 openssh-portable libidn2 librtmp libnghttp2 nghttp2 stunnel + - pkg delete -y curl + configure_script: + - ./buildconf + - case `uname -r` in + 13.0*) + export CC=clang; + export CFLAGS="-fsanitize=address,undefined,signed-integer-overflow -fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security -Werror=array-bounds -g"; + export CXXFLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security -Werror=array-bounds -g"; + export LDFLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined,integer" ;; + esac + - ./configure --prefix="${HOME}"/install --enable-debug --with-libssh2 --with-brotli --with-gssapi --with-libidn2 --enable-manual --enable-ldap --enable-ldaps --with-librtmp --with-libmetalink --with-libpsl --with-nghttp2 || { tail -300 config.log; false; } + compile_script: + - make V=1 + test_script: + # blackhole? + - sysctl net.inet.tcp.blackhole + # make sure we don't run blackhole != 0 + - sudo sysctl net.inet.tcp.blackhole=0 + # Some tests won't run if run as root so run them as another user. + # Make directories world writable so the test step can write wherever it needs. + - find . -type d -exec chmod 777 {} \; + # TODO: A number of tests are failing on different FreeBSD versions and so + # are disabled. This should be investigated. + - SKIP_TESTS='' + - uname -r + - case `uname -r` in + 13.0*) SKIP_TESTS='!323 !1242 !1243 !2002 !2003';; + 12.1*) SKIP_TESTS='!323 !1242 !1243 !2002 !2003';; + 11.3*) SKIP_TESTS='!504 !1242 !1243 !2002 !2003';; + 10.4*) SKIP_TESTS='!310 !311 !312 !313 !1082 !1242 !1243 !2002 !2003 !2034 !2035 !2037 !2038 !2041 !2042 !2048 !3000 !3001';; + esac + - sudo -u nobody make V=1 TFLAGS="-n -a -p !flaky ${SKIP_TESTS}" test-nonflaky + install_script: + - make V=1 install diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000000..ed91b128c5 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,10 @@ +;;; Directory Local Variables +;;; See Info node `(emacs) Directory Variables' for more information. + +((nil . ((indent-tabs-mode . nil) + (show-trailing-whitespace . t))) + (c-mode . ((c-basic-offset . 2) + )) + (c++-mode . ((c-basic-offset . 2) + )) + ) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..cd3fde9545 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +*.dsw -crlf +buildconf eol=lf +configure.ac eol=lf +*.m4 eol=lf +*.in eol=lf +*.am eol=lf +*.sh eol=lf +*.[ch] whitespace=tab-in-indent diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..bce89b4442 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,23 @@ +How to contribute to curl +========================= + +Join the community +------------------ + + 1. Click 'watch' on the github repo + + 2. Subscribe to the suitable [mailing lists](https://curl.haxx.se/mail/) + +Read [CONTRIBUTE](../docs/CONTRIBUTE.md) +--------------------------------------- + +Send your suggestions using one of these methods: +------------------------------------------------- + + 1. in a mail to the mailing list + + 2. as a [pull request](https://github.com/curl/curl/pulls) + + 3. as an [issue](https://github.com/curl/curl/issues) + +/ The curl team! diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..fb9cb5b485 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: curl diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE new file mode 100644 index 0000000000..452cafb592 --- /dev/null +++ b/.github/ISSUE_TEMPLATE @@ -0,0 +1,19 @@ + + +### I did this + +### I expected the following + +### curl/libcurl version + +[curl -V output] + +### operating system + + diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 0000000000..66e79128e4 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,8 @@ +# Configuration for lock-threads - https://github.com/dessant/lock-threads + +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 90 +# Comment to post before locking. Set to `false` to disable +lockComment: false +# Limit to only `issues` or `pulls` +# only: issues diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000..9bcd4eb1d5 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 180 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 14 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml new file mode 100644 index 0000000000..94eb070d5e --- /dev/null +++ b/.github/workflows/cpp.yml @@ -0,0 +1,17 @@ +name: Build on Ubuntu with default options + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: configure + run: ./buildconf && ./configure + - name: make + run: make + - name: make check + run: make test-nonflaky diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 0000000000..296acc7970 --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,23 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'curl' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'curl' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() + with: + name: artifacts + path: ./out/artifacts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..9b040fea07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,60 @@ +*.asc +*.dll +*.exe +*.exp +*.la +*.lib +*.lo +*.o +*.obj +*.pdb +*.pyc +*~ +.*.sw? +.cproject +.deps +.dirstamp +.libs +.project +.settings +/.vs +/build/ +/builds/ +__pycache__ +CHANGES.dist +Debug +INSTALL +Makefile +Makefile.in +Release +TAGS +aclocal.m4 +aclocal.m4.bak +autom4te.cache +compile +config.cache +config.guess +config.log +config.status +config.sub +configure +curl-*.tar.bz2 +curl-*.tar.gz +curl-*.tar.xz +curl-*.zip +curl-config +depcomp +install-sh +libcurl.pc +libtool +ltmain.sh +missing +mkinstalldirs +tags +test-driver +scripts/_curl +scripts/curl.fish +curl_fuzzer +curl_fuzzer_seed_corpus.zip +libstandaloneengine.a +.checksrc diff --git a/.lgtm.yml b/.lgtm.yml new file mode 100644 index 0000000000..030c563bd8 --- /dev/null +++ b/.lgtm.yml @@ -0,0 +1,10 @@ +extraction: + cpp: + prepare: + packages: # to avoid confusion with libopenafs-dev which also provides a des.h + - libssl-dev + after_prepare: # make sure lgtm.com doesn't use CMake (which generates and runs tests) + - rm -f CMakeLists.txt + - ./buildconf + configure: # enable as many optional features as possible + command: ./configure --enable-ares --with-libssh2 --with-gssapi --with-librtmp --with-libmetalink diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..14b7b73ada --- /dev/null +++ b/.mailmap @@ -0,0 +1,61 @@ +Guenter Knauf +Gisle Vanem +Gisle Vanem +Alessandro Ghedini +Alessandro Ghedini +Björn Stenberg +Björn Stenberg +Viktor Szakats +Viktor Szakats +Daniel Gustafsson +Daniel Gustafsson +Linus Nielsen +Yamada Yasuharu +Ulion +Tim Rühsen +Steve Holme +Claes Jakobsson +Sergei Nikulov +Patrick Monnerat +Patrick Monnerat +Patrick Monnerat +Patrick Monnerat +Nick Zitzmann +Peter Wu +David Woodhouse +Marcel Raad +Marcel Raad +Marcel Raad +Anthony Bryan +Travis Burtrum +Dmitry Kostjuchenko +Richard Alcock +Richard Alcock +Jan Ehrhardt +Florin Petriuc +Pavel Pavlov +Jason Juang +Carlo Teubner +Joel Depooter +Sebastian Mundry +Rainer Canavan +Dan Fandrich +Henrik S. Gaßmann +Jiří Malák +Nick Zitzmann +Kees Dekker +Max Savenkov +Daniel Jelinski <30433125+djelinski@users.noreply.github.com> +Amit Katyal +Giorgos Oikonomou +Evgeny Grin +Peter Pih +Anton Malov +Marquis de Muesli +Kyohei Kadota +Lucas Pardue +Massimiliano Fantuzzi +Niall O'Reilly +Mohammad Hasbini +Andrew Ishchuk +Nicolas Guillier <59726521+nicoguillier@users.noreply.github.com> diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..4174168ece --- /dev/null +++ b/.travis.yml @@ -0,0 +1,441 @@ +language: c +sudo: required +cache: + directories: + - $HOME/wolfssl-4.0.0-stable + - $HOME/mesalink-1.0.0 + - $HOME/nghttp2-1.39.2 + +env: + global: + - LD_LIBRARY_PATH=/usr/local/lib + +addons: + apt: + config: + retries: true + sources: &common_sources + - ubuntu-toolchain-r-test + packages: &common_packages + - cmake + - gcc-8 + - valgrind + - libev-dev + - libc-ares-dev + - g++-8 + - libstdc++-8-dev + - stunnel4 + - libidn2-0-dev + - gnutls-bin + +matrix: + include: + - os: linux + compiler: gcc + dist: trusty + env: + - T=normal C="--with-gssapi --with-libssh2" CHECKSRC=1 + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - krb5-user + - libssh2-1-dev + - os: linux + compiler: gcc + dist: trusty + env: + - T=normal C=--with-libssh + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libssh-dev + - os: linux + compiler: gcc + dist: trusty + env: + - T=normal C="--enable-ares" + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + - os: linux + compiler: gcc + dist: bionic + env: + - T=normal C="--disable-verbose" CPPFLAGS="-Wno-variadic-macros" NOTESTS=1 + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: bionic + before_install: + # Install and use the current stable release of Go + - gimme --list + - eval "$(gimme stable)" + - gimme --list + env: + - T=novalgrind BORINGSSL=yes C="--with-ssl=$HOME/boringssl" LD_LIBRARY_PATH=/home/travis/boringssl/lib:/usr/local/lib + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - ppa:longsleep/golang-backports + - *common_sources + packages: + - *common_packages + - os: linux + compiler: gcc + dist: bionic + before_install: + # Install and use the current stable release of Go + - gimme --list + - eval "$(gimme stable)" + - gimme --list + env: + - T=novalgrind BORINGSSL=yes QUICHE="yes" C="--with-ssl=$HOME/boringssl --with-quiche=$HOME/quiche/target/release --enable-alt-svc" LD_LIBRARY_PATH=/home/travis/boringssl/lib:$HOME/quiche/target/release:/usr/local/lib + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: xenial + env: + - T=novalgrind NGTCP2=yes C="--with-ssl=$HOME/ngbuild --with-ngtcp2=$HOME/ngbuild --with-nghttp3=$HOME/ngbuild --enable-alt-svc" NOTESTS= + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: bionic + env: + - T=debug-wolfssl C="--with-wolfssl --without-ssl" + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: bionic + env: + - T=debug-mesalink C="--with-mesalink --without-ssl" + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: xenial + env: + - T=debug + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-xenial-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: xenial + env: + - T=debug C="--enable-alt-svc" + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-xenial-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: xenial + env: + - T=debug C="--with-mbedtls --without-ssl" + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-xenial-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - libmbedtls-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=debug C="--with-gnutls --without-ssl" + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - libgnutls28-dev + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=debug C="--with-nss --without-ssl" NOTESTS=1 CPPFLAGS="-isystem /usr/include/nss" + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - libnss3-dev + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: trusty + env: + - T=iconv + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + - os: osx + compiler: gcc + env: T=debug C="--disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-ldap --disable-pop3 --disable-rtmp --disable-rtsp --disable-scp --disable-sftp --disable-smb --disable-smtp --disable-telnet --disable-tftp --disable-unix-sockets --disable-shared --enable-debug --enable-maintainer-mode --without-brotli --without-gssapi --without-libidn2 --without-libmetalink --without-libpsl --without-librtmp --without-libssh2 --without-nghttp2 --without-ntlm-auth --without-ssl --without-zlib" + - os: osx + compiler: gcc + env: T=debug C=--enable-ares + - os: osx + compiler: gcc + env: T=debug C="--with-ssl=/usr/local/opt/openssl --with-libmetalink" + - os: osx + compiler: gcc + env: T=debug C="--with-ssl=/usr/local/opt/libressl --with-libmetalink" + - os: osx + compiler: clang + osx_image: xcode10 + env: T=debug C="--without-ssl --with-darwinssl --with-libmetalink" + - os: osx + compiler: clang + env: T=normal + - os: osx + compiler: clang + env: T=cmake + - os: linux + compiler: gcc + dist: bionic + env: + - T=cmake + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=cmake + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: gcc + dist: xenial + env: + - T=torture + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - lcov + - libpsl-dev + - libbrotli-dev + - libssh2-1-dev + - os: linux + compiler: gcc + dist: bionic + env: + - T=distcheck + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=fuzzer + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=tidy + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - clang-tidy-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: bionic + env: + - T=scan-build + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-bionic-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + compiler: clang + dist: xenial + env: + - T=debug CFLAGS="-fsanitize=address,undefined,signed-integer-overflow -fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security -Werror=array-bounds -g" LDFLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined,integer" LIBS="-ldl -lubsan" + - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7" + addons: + apt: + sources: + - *common_sources + - llvm-toolchain-xenial-7 + packages: + - *common_packages + - clang-7 + - libpsl-dev + - libbrotli-dev + - os: linux + arch: arm64 + compiler: gcc + dist: bionic + env: + - T=debug C="--enable-alt-svc" + - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8" + addons: + apt: + sources: + - *common_sources + packages: + - *common_packages + - libpsl-dev + - libbrotli-dev + - libev-dev + - libssl-dev + - libtool + - pkg-config + - zlib1g-dev + +before_install: + - export "${OVERRIDE_CC-blank=}" + - export "${OVERRIDE_CXX-blank=}" + +install: + - if [ "$T" = "coverage" ]; then pip2 install --user cpp-coveralls; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update > /dev/null; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew reinstall libtool > /dev/null; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install rtmpdump libssh2 c-ares libmetalink libressl nghttp2 libmetalink; fi + +# before_script and script: +# Travis isn't reliable catching errors in inline script commands (#3730). +# Do not add anything here, instead add to the respective script. +before_script: + - ./scripts/travis/before_script.sh || travis_terminate 1 +script: + - ./scripts/travis/script.sh || travis_terminate 1 + +# whitelist branches to avoid testing feature branches twice (as branch and as pull request) +branches: + only: + - master + - /\/ci$/ + +notifications: + email: false diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000000..4d13ef6963 --- /dev/null +++ b/CHANGES @@ -0,0 +1,7 @@ +See https://curl.haxx.se/changes.html for the edited and human readable online +version of what has changed over the years in different curl releases. + +Generate a CHANGES file like the one present in every release like this: + +$ git log --pretty=fuller --no-color --date=short --decorate=full | \ + ./scripts/log2changes.pl diff --git a/CMake/CMakeConfigurableFile.in b/CMake/CMakeConfigurableFile.in new file mode 100644 index 0000000000..df2c382e9b --- /dev/null +++ b/CMake/CMakeConfigurableFile.in @@ -0,0 +1 @@ +@CMAKE_CONFIGURABLE_FILE_CONTENT@ diff --git a/CMake/CurlSymbolHiding.cmake b/CMake/CurlSymbolHiding.cmake new file mode 100644 index 0000000000..8e5fd67a0a --- /dev/null +++ b/CMake/CurlSymbolHiding.cmake @@ -0,0 +1,55 @@ +include(CheckCSourceCompiles) + +option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON) +mark_as_advanced(CURL_HIDDEN_SYMBOLS) + +if(CURL_HIDDEN_SYMBOLS) + set(SUPPORTS_SYMBOL_HIDING FALSE) + + if(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(SUPPORTS_SYMBOL_HIDING TRUE) + set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))") + set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden") + elseif(CMAKE_COMPILER_IS_GNUCC) + if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4) + # note: this is considered buggy prior to 4.0 but the autotools don't care, so let's ignore that fact + set(SUPPORTS_SYMBOL_HIDING TRUE) + set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))") + set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden") + endif() + elseif(CMAKE_C_COMPILER_ID MATCHES "SunPro" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.0) + set(SUPPORTS_SYMBOL_HIDING TRUE) + set(_SYMBOL_EXTERN "__global") + set(_CFLAG_SYMBOLS_HIDE "-xldscope=hidden") + elseif(CMAKE_C_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0) + # note: this should probably just check for version 9.1.045 but I'm not 100% sure + # so let's do it the same way autotools do. + set(SUPPORTS_SYMBOL_HIDING TRUE) + set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))") + set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden") + check_c_source_compiles("#include + int main (void) { printf(\"icc fvisibility bug test\"); return 0; }" _no_bug) + if(NOT _no_bug) + set(SUPPORTS_SYMBOL_HIDING FALSE) + set(_SYMBOL_EXTERN "") + set(_CFLAG_SYMBOLS_HIDE "") + endif() + elseif(MSVC) + set(SUPPORTS_SYMBOL_HIDING TRUE) + endif() + + set(HIDES_CURL_PRIVATE_SYMBOLS ${SUPPORTS_SYMBOL_HIDING}) +elseif(MSVC) + if(NOT CMAKE_VERSION VERSION_LESS 3.7) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) #present since 3.4.3 but broken + set(HIDES_CURL_PRIVATE_SYMBOLS FALSE) + else() + message(WARNING "Hiding private symbols regardless CURL_HIDDEN_SYMBOLS being disabled.") + set(HIDES_CURL_PRIVATE_SYMBOLS TRUE) + endif() +else() + set(HIDES_CURL_PRIVATE_SYMBOLS FALSE) +endif() + +set(CURL_CFLAG_SYMBOLS_HIDE ${_CFLAG_SYMBOLS_HIDE}) +set(CURL_EXTERN_SYMBOL ${_SYMBOL_EXTERN}) diff --git a/CMake/CurlTests.c b/CMake/CurlTests.c new file mode 100644 index 0000000000..3ef35f0253 --- /dev/null +++ b/CMake/CurlTests.c @@ -0,0 +1,617 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://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. + * + ***************************************************************************/ +#ifdef TIME_WITH_SYS_TIME +/* Time with sys/time test */ + +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} + +#endif + +#ifdef HAVE_FCNTL_O_NONBLOCK + +/* headers for FCNTL_O_NONBLOCK test */ +#include +#include +#include +/* */ +#if defined(sun) || defined(__sun__) || \ + defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# if defined(__SVR4) || defined(__srv4__) +# define PLATFORM_SOLARIS +# else +# define PLATFORM_SUNOS4 +# endif +#endif +#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41) +# define PLATFORM_AIX_V3 +#endif +/* */ +#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) +#error "O_NONBLOCK does not work on this platform" +#endif + +int +main () +{ + /* O_NONBLOCK source test */ + int flags = 0; + if(0 != fcntl(0, F_SETFL, flags | O_NONBLOCK)) + return 1; + return 0; +} +#endif + +/* tests for gethostbyaddr_r or gethostbyname_r */ +#if defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) || \ + defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT) || \ + defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT) || \ + defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT) || \ + defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \ + defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT) +# define _REENTRANT + /* no idea whether _REENTRANT is always set, just invent a new flag */ +# define TEST_GETHOSTBYFOO_REENTRANT +#endif +#if defined(HAVE_GETHOSTBYADDR_R_5) || \ + defined(HAVE_GETHOSTBYADDR_R_7) || \ + defined(HAVE_GETHOSTBYADDR_R_8) || \ + defined(HAVE_GETHOSTBYNAME_R_3) || \ + defined(HAVE_GETHOSTBYNAME_R_5) || \ + defined(HAVE_GETHOSTBYNAME_R_6) || \ + defined(TEST_GETHOSTBYFOO_REENTRANT) +#include +#include +int main(void) +{ + char *address = "example.com"; + int length = 0; + int type = 0; + struct hostent h; + int rc = 0; +#if defined(HAVE_GETHOSTBYADDR_R_5) || \ + defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) || \ + \ + defined(HAVE_GETHOSTBYNAME_R_3) || \ + defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT) + struct hostent_data hdata; +#elif defined(HAVE_GETHOSTBYADDR_R_7) || \ + defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT) || \ + defined(HAVE_GETHOSTBYADDR_R_8) || \ + defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT) || \ + \ + defined(HAVE_GETHOSTBYNAME_R_5) || \ + defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \ + defined(HAVE_GETHOSTBYNAME_R_6) || \ + defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT) + char buffer[8192]; + int h_errnop; + struct hostent *hp; +#endif + +#ifndef gethostbyaddr_r + (void)gethostbyaddr_r; +#endif + +#if defined(HAVE_GETHOSTBYADDR_R_5) || \ + defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) + rc = gethostbyaddr_r(address, length, type, &h, &hdata); + (void)rc; +#elif defined(HAVE_GETHOSTBYADDR_R_7) || \ + defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT) + hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop); + (void)hp; +#elif defined(HAVE_GETHOSTBYADDR_R_8) || \ + defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT) + rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop); + (void)rc; +#endif + +#if defined(HAVE_GETHOSTBYNAME_R_3) || \ + defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT) + rc = gethostbyname_r(address, &h, &hdata); +#elif defined(HAVE_GETHOSTBYNAME_R_5) || \ + defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) + rc = gethostbyname_r(address, &h, buffer, 8192, &h_errnop); + (void)hp; /* not used for test */ +#elif defined(HAVE_GETHOSTBYNAME_R_6) || \ + defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT) + rc = gethostbyname_r(address, &h, buffer, 8192, &hp, &h_errnop); +#endif + + (void)length; + (void)type; + (void)rc; + return 0; +} +#endif + +#ifdef HAVE_SOCKLEN_T +#ifdef _WIN32 +#include +#else +#include +#include +#endif +int +main () +{ +if ((socklen_t *) 0) + return 0; +if (sizeof (socklen_t)) + return 0; + ; + return 0; +} +#endif +#ifdef HAVE_IN_ADDR_T +#include +#include +#include + +int +main () +{ +if ((in_addr_t *) 0) + return 0; +if (sizeof (in_addr_t)) + return 0; + ; + return 0; +} +#endif + +#ifdef HAVE_BOOL_T +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDBOOL_H +#include +#endif +int +main () +{ +if (sizeof (bool *) ) + return 0; + ; + return 0; +} +#endif + +#ifdef STDC_HEADERS +#include +#include +#include +#include +int main() { return 0; } +#endif +#ifdef RETSIGTYPE_TEST +#include +#include +#ifdef signal +# undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int +main () +{ + return 0; +} +#endif +#ifdef HAVE_INET_NTOA_R_DECL +#include + +typedef void (*func_type)(); + +int main() +{ +#ifndef inet_ntoa_r + func_type func; + func = (func_type)inet_ntoa_r; + (void)func; +#endif + return 0; +} +#endif +#ifdef HAVE_INET_NTOA_R_DECL_REENTRANT +#define _REENTRANT +#include + +typedef void (*func_type)(); + +int main() +{ +#ifndef inet_ntoa_r + func_type func; + func = (func_type)&inet_ntoa_r; + (void)func; +#endif + return 0; +} +#endif +#ifdef HAVE_GETADDRINFO +#include +#include +#include + +int main(void) { + struct addrinfo hints, *ai; + int error; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; +#ifndef getaddrinfo + (void)getaddrinfo; +#endif + error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); + if (error) { + return 1; + } + return 0; +} +#endif +#ifdef HAVE_FILE_OFFSET_BITS +#ifdef _FILE_OFFSET_BITS +#undef _FILE_OFFSET_BITS +#endif +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int main () { ; return 0; } +#endif +#ifdef HAVE_IOCTLSOCKET +/* includes start */ +#ifdef HAVE_WINDOWS_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# ifdef HAVE_WINSOCK2_H +# include +# else +# ifdef HAVE_WINSOCK_H +# include +# endif +# endif +#endif + +int +main () +{ + +/* ioctlsocket source code */ + int socket; + unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); + + ; + return 0; +} + +#endif +#ifdef HAVE_IOCTLSOCKET_CAMEL +/* includes start */ +#ifdef HAVE_WINDOWS_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# ifdef HAVE_WINSOCK2_H +# include +# else +# ifdef HAVE_WINSOCK_H +# include +# endif +# endif +#endif + +int +main () +{ + +/* IoctlSocket source code */ + if(0 != IoctlSocket(0, 0, 0)) + return 1; + ; + return 0; +} +#endif +#ifdef HAVE_IOCTLSOCKET_CAMEL_FIONBIO +/* includes start */ +#ifdef HAVE_WINDOWS_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# ifdef HAVE_WINSOCK2_H +# include +# else +# ifdef HAVE_WINSOCK_H +# include +# endif +# endif +#endif + +int +main () +{ + +/* IoctlSocket source code */ + long flags = 0; + if(0 != ioctlsocket(0, FIONBIO, &flags)) + return 1; + ; + return 0; +} +#endif +#ifdef HAVE_IOCTLSOCKET_FIONBIO +/* includes start */ +#ifdef HAVE_WINDOWS_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# ifdef HAVE_WINSOCK2_H +# include +# else +# ifdef HAVE_WINSOCK_H +# include +# endif +# endif +#endif + +int +main () +{ + + int flags = 0; + if(0 != ioctlsocket(0, FIONBIO, &flags)) + return 1; + + ; + return 0; +} +#endif +#ifdef HAVE_IOCTL_FIONBIO +/* headers for FIONBIO test */ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef HAVE_STROPTS_H +# include +#endif + +int +main () +{ + + int flags = 0; + if(0 != ioctl(0, FIONBIO, &flags)) + return 1; + + ; + return 0; +} +#endif +#ifdef HAVE_IOCTL_SIOCGIFADDR +/* headers for FIONBIO test */ +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef HAVE_STROPTS_H +# include +#endif +#include + +int +main () +{ + struct ifreq ifr; + if(0 != ioctl(0, SIOCGIFADDR, &ifr)) + return 1; + + ; + return 0; +} +#endif +#ifdef HAVE_SETSOCKOPT_SO_NONBLOCK +/* includes start */ +#ifdef HAVE_WINDOWS_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# ifdef HAVE_WINSOCK2_H +# include +# else +# ifdef HAVE_WINSOCK_H +# include +# endif +# endif +#endif +/* includes start */ +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +/* includes end */ + +int +main () +{ + if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0)) + return 1; + ; + return 0; +} +#endif +#ifdef HAVE_GLIBC_STRERROR_R +#include +#include + +void check(char c) {} + +int +main () { + char buffer[1024]; + /* This will not compile if strerror_r does not return a char* */ + check(strerror_r(EACCES, buffer, sizeof(buffer))[0]); + return 0; +} +#endif +#ifdef HAVE_POSIX_STRERROR_R +#include +#include + +/* float, because a pointer can't be implicitly cast to float */ +void check(float f) {} + +int +main () { + char buffer[1024]; + /* This will not compile if strerror_r does not return an int */ + check(strerror_r(EACCES, buffer, sizeof(buffer))); + return 0; +} +#endif +#ifdef HAVE_FSETXATTR_6 +#include /* header from libc, not from libattr */ +int +main() { + fsetxattr(0, 0, 0, 0, 0, 0); + return 0; +} +#endif +#ifdef HAVE_FSETXATTR_5 +#include /* header from libc, not from libattr */ +int +main() { + fsetxattr(0, 0, 0, 0, 0); + return 0; +} +#endif +#ifdef HAVE_CLOCK_GETTIME_MONOTONIC +#include +int +main() { + struct timespec ts = {0, 0}; + clock_gettime(CLOCK_MONOTONIC, &ts); + return 0; +} +#endif +#ifdef HAVE_BUILTIN_AVAILABLE +int +main() { + if(__builtin_available(macOS 10.12, *)) {} + return 0; +} +#endif +#ifdef HAVE_VARIADIC_MACROS_C99 +#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__) +#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__) + +int fun3(int arg1, int arg2, int arg3); +int fun2(int arg1, int arg2); + +int fun3(int arg1, int arg2, int arg3) { + return arg1 + arg2 + arg3; +} +int fun2(int arg1, int arg2) { + return arg1 + arg2; +} + +int +main() { + int res3 = c99_vmacro3(1, 2, 3); + int res2 = c99_vmacro2(1, 2); + (void)res3; + (void)res2; + return 0; +} +#endif +#ifdef HAVE_VARIADIC_MACROS_GCC +#define gcc_vmacro3(first, args...) fun3(first, args) +#define gcc_vmacro2(first, args...) fun2(first, args) + +int fun3(int arg1, int arg2, int arg3); +int fun2(int arg1, int arg2); + +int fun3(int arg1, int arg2, int arg3) { + return arg1 + arg2 + arg3; +} +int fun2(int arg1, int arg2) { + return arg1 + arg2; +} + +int +main() { + int res3 = gcc_vmacro3(1, 2, 3); + int res2 = gcc_vmacro2(1, 2); + (void)res3; + (void)res2; + return 0; +} +#endif diff --git a/CMake/FindBearSSL.cmake b/CMake/FindBearSSL.cmake new file mode 100644 index 0000000000..20d239a4fd --- /dev/null +++ b/CMake/FindBearSSL.cmake @@ -0,0 +1,9 @@ +find_path(BEARSSL_INCLUDE_DIRS bearssl.h) + +find_library(BEARSSL_LIBRARY bearssl) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(BEARSSL DEFAULT_MSG + BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY) + +mark_as_advanced(BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY) diff --git a/CMake/FindBrotli.cmake b/CMake/FindBrotli.cmake new file mode 100644 index 0000000000..351b8f757b --- /dev/null +++ b/CMake/FindBrotli.cmake @@ -0,0 +1,20 @@ +include(FindPackageHandleStandardArgs) + +find_path(BROTLI_INCLUDE_DIR "brotli/decode.h") + +find_library(BROTLICOMMON_LIBRARY NAMES brotlicommon) +find_library(BROTLIDEC_LIBRARY NAMES brotlidec) + +find_package_handle_standard_args(BROTLI + FOUND_VAR + BROTLI_FOUND + REQUIRED_VARS + BROTLIDEC_LIBRARY + BROTLICOMMON_LIBRARY + BROTLI_INCLUDE_DIR + FAIL_MESSAGE + "Could NOT find BROTLI" +) + +set(BROTLI_INCLUDE_DIRS ${BROTLI_INCLUDE_DIR}) +set(BROTLI_LIBRARIES ${BROTLICOMMON_LIBRARY} ${BROTLIDEC_LIBRARY}) diff --git a/CMake/FindCARES.cmake b/CMake/FindCARES.cmake new file mode 100644 index 0000000000..3d1bae6dcf --- /dev/null +++ b/CMake/FindCARES.cmake @@ -0,0 +1,24 @@ +# - Find c-ares +# Find the c-ares includes and library +# This module defines +# CARES_INCLUDE_DIR, where to find ares.h, etc. +# CARES_LIBRARIES, the libraries needed to use c-ares. +# CARES_FOUND, If false, do not try to use c-ares. +# also defined, but not for general use are +# CARES_LIBRARY, where to find the c-ares library. + +find_path(CARES_INCLUDE_DIR ares.h) + +set(CARES_NAMES ${CARES_NAMES} cares) +find_library(CARES_LIBRARY + NAMES ${CARES_NAMES} + ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(CARES + REQUIRED_VARS CARES_LIBRARY CARES_INCLUDE_DIR) + +mark_as_advanced( + CARES_LIBRARY + CARES_INCLUDE_DIR + ) diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake new file mode 100644 index 0000000000..a2f150cdaf --- /dev/null +++ b/CMake/FindGSS.cmake @@ -0,0 +1,289 @@ +# - Try to find the GSS Kerberos library +# Once done this will define +# +# GSS_ROOT_DIR - Set this variable to the root installation of GSS +# +# Read-Only variables: +# GSS_FOUND - system has the Heimdal library +# GSS_FLAVOUR - "MIT" or "Heimdal" if anything found. +# GSS_INCLUDE_DIR - the Heimdal include directory +# GSS_LIBRARIES - The libraries needed to use GSS +# GSS_LINK_DIRECTORIES - Directories to add to linker search path +# GSS_LINKER_FLAGS - Additional linker flags +# GSS_COMPILER_FLAGS - Additional compiler flags +# GSS_VERSION - This is set to version advertised by pkg-config or read from manifest. +# In case the library is found but no version info available it'll be set to "unknown" + +set(_MIT_MODNAME mit-krb5-gssapi) +set(_HEIMDAL_MODNAME heimdal-gssapi) + +include(CheckIncludeFile) +include(CheckIncludeFiles) +include(CheckTypeSize) + +set(_GSS_ROOT_HINTS + "${GSS_ROOT_DIR}" + "$ENV{GSS_ROOT_DIR}" +) + +# try to find library using system pkg-config if user didn't specify root dir +if(NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR}") + if(UNIX) + find_package(PkgConfig QUIET) + pkg_search_module(_GSS_PKG ${_MIT_MODNAME} ${_HEIMDAL_MODNAME}) + list(APPEND _GSS_ROOT_HINTS "${_GSS_PKG_PREFIX}") + elseif(WIN32) + list(APPEND _GSS_ROOT_HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos;InstallDir]") + endif() +endif() + +if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approach. + find_file(_GSS_CONFIGURE_SCRIPT + NAMES + "krb5-config" + HINTS + ${_GSS_ROOT_HINTS} + PATH_SUFFIXES + bin + NO_CMAKE_PATH + NO_CMAKE_ENVIRONMENT_PATH + ) + + # if not found in user-supplied directories, maybe system knows better + find_file(_GSS_CONFIGURE_SCRIPT + NAMES + "krb5-config" + PATH_SUFFIXES + bin + ) + + if(_GSS_CONFIGURE_SCRIPT) + execute_process( + COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi" + OUTPUT_VARIABLE _GSS_CFLAGS + RESULT_VARIABLE _GSS_CONFIGURE_FAILED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + message(STATUS "CFLAGS: ${_GSS_CFLAGS}") + if(NOT _GSS_CONFIGURE_FAILED) # 0 means success + # should also work in an odd case when multiple directories are given + string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS) + string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}") + string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}") + + foreach(_flag ${_GSS_CFLAGS}) + if(_flag MATCHES "^-I.*") + string(REGEX REPLACE "^-I" "" _val "${_flag}") + list(APPEND _GSS_INCLUDE_DIR "${_val}") + else() + list(APPEND _GSS_COMPILER_FLAGS "${_flag}") + endif() + endforeach() + endif() + + execute_process( + COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi" + OUTPUT_VARIABLE _GSS_LIB_FLAGS + RESULT_VARIABLE _GSS_CONFIGURE_FAILED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}") + + if(NOT _GSS_CONFIGURE_FAILED) # 0 means success + # this script gives us libraries and link directories. Blah. We have to deal with it. + string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS) + string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}") + string(REGEX REPLACE " +-([^Ll][^ \\t;]*)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}") + + foreach(_flag ${_GSS_LIB_FLAGS}) + if(_flag MATCHES "^-l.*") + string(REGEX REPLACE "^-l" "" _val "${_flag}") + list(APPEND _GSS_LIBRARIES "${_val}") + elseif(_flag MATCHES "^-L.*") + string(REGEX REPLACE "^-L" "" _val "${_flag}") + list(APPEND _GSS_LINK_DIRECTORIES "${_val}") + else() + list(APPEND _GSS_LINKER_FLAGS "${_flag}") + endif() + endforeach() + endif() + + execute_process( + COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version" + OUTPUT_VARIABLE _GSS_VERSION + RESULT_VARIABLE _GSS_CONFIGURE_FAILED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # older versions may not have the "--version" parameter. In this case we just don't care. + if(_GSS_CONFIGURE_FAILED) + set(_GSS_VERSION 0) + endif() + + execute_process( + COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor" + OUTPUT_VARIABLE _GSS_VENDOR + RESULT_VARIABLE _GSS_CONFIGURE_FAILED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # older versions may not have the "--vendor" parameter. In this case we just don't care. + if(_GSS_CONFIGURE_FAILED) + set(GSS_FLAVOUR "Heimdal") # most probably, shouldn't really matter + else() + if(_GSS_VENDOR MATCHES ".*H|heimdal.*") + set(GSS_FLAVOUR "Heimdal") + else() + set(GSS_FLAVOUR "MIT") + endif() + endif() + + else() # either there is no config script or we are on a platform that doesn't provide one (Windows?) + + find_path(_GSS_INCLUDE_DIR + NAMES + "gssapi/gssapi.h" + HINTS + ${_GSS_ROOT_HINTS} + PATH_SUFFIXES + include + inc + ) + + if(_GSS_INCLUDE_DIR) #jay, we've found something + set(CMAKE_REQUIRED_INCLUDES "${_GSS_INCLUDE_DIR}") + check_include_files( "gssapi/gssapi_generic.h;gssapi/gssapi_krb5.h" _GSS_HAVE_MIT_HEADERS) + + if(_GSS_HAVE_MIT_HEADERS) + set(GSS_FLAVOUR "MIT") + else() + # prevent compiling the header - just check if we can include it + set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D__ROKEN_H__") + check_include_file( "roken.h" _GSS_HAVE_ROKEN_H) + + check_include_file( "heimdal/roken.h" _GSS_HAVE_HEIMDAL_ROKEN_H) + if(_GSS_HAVE_ROKEN_H OR _GSS_HAVE_HEIMDAL_ROKEN_H) + set(GSS_FLAVOUR "Heimdal") + endif() + set(CMAKE_REQUIRED_DEFINITIONS "") + endif() + else() + # I'm not convinced if this is the right way but this is what autotools do at the moment + find_path(_GSS_INCLUDE_DIR + NAMES + "gssapi.h" + HINTS + ${_GSS_ROOT_HINTS} + PATH_SUFFIXES + include + inc + ) + + if(_GSS_INCLUDE_DIR) + set(GSS_FLAVOUR "Heimdal") + endif() + endif() + + # if we have headers, check if we can link libraries + if(GSS_FLAVOUR) + set(_GSS_LIBDIR_SUFFIXES "") + set(_GSS_LIBDIR_HINTS ${_GSS_ROOT_HINTS}) + get_filename_component(_GSS_CALCULATED_POTENTIAL_ROOT "${_GSS_INCLUDE_DIR}" PATH) + list(APPEND _GSS_LIBDIR_HINTS ${_GSS_CALCULATED_POTENTIAL_ROOT}) + + if(WIN32) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + list(APPEND _GSS_LIBDIR_SUFFIXES "lib/AMD64") + if(GSS_FLAVOUR STREQUAL "MIT") + set(_GSS_LIBNAME "gssapi64") + else() + set(_GSS_LIBNAME "libgssapi") + endif() + else() + list(APPEND _GSS_LIBDIR_SUFFIXES "lib/i386") + if(GSS_FLAVOUR STREQUAL "MIT") + set(_GSS_LIBNAME "gssapi32") + else() + set(_GSS_LIBNAME "libgssapi") + endif() + endif() + else() + list(APPEND _GSS_LIBDIR_SUFFIXES "lib;lib64") # those suffixes are not checked for HINTS + if(GSS_FLAVOUR STREQUAL "MIT") + set(_GSS_LIBNAME "gssapi_krb5") + else() + set(_GSS_LIBNAME "gssapi") + endif() + endif() + + find_library(_GSS_LIBRARIES + NAMES + ${_GSS_LIBNAME} + HINTS + ${_GSS_LIBDIR_HINTS} + PATH_SUFFIXES + ${_GSS_LIBDIR_SUFFIXES} + ) + + endif() + endif() +else() + if(_GSS_PKG_${_MIT_MODNAME}_VERSION) + set(GSS_FLAVOUR "MIT") + set(_GSS_VERSION _GSS_PKG_${_MIT_MODNAME}_VERSION) + else() + set(GSS_FLAVOUR "Heimdal") + set(_GSS_VERSION _GSS_PKG_${_MIT_HEIMDAL}_VERSION) + endif() +endif() + +set(GSS_INCLUDE_DIR ${_GSS_INCLUDE_DIR}) +set(GSS_LIBRARIES ${_GSS_LIBRARIES}) +set(GSS_LINK_DIRECTORIES ${_GSS_LINK_DIRECTORIES}) +set(GSS_LINKER_FLAGS ${_GSS_LINKER_FLAGS}) +set(GSS_COMPILER_FLAGS ${_GSS_COMPILER_FLAGS}) +set(GSS_VERSION ${_GSS_VERSION}) + +if(GSS_FLAVOUR) + if(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "Heimdal") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.amd64.manifest") + else() + set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.x86.manifest") + endif() + + if(EXISTS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}") + file(STRINGS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}" heimdal_version_str + REGEX "^.*version=\"[0-9]\\.[^\"]+\".*$") + + string(REGEX MATCH "[0-9]\\.[^\"]+" + GSS_VERSION "${heimdal_version_str}") + endif() + + if(NOT GSS_VERSION) + set(GSS_VERSION "Heimdal Unknown") + endif() + elseif(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "MIT") + get_filename_component(_MIT_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos\\SDK\\CurrentVersion;VersionString]" NAME CACHE) + if(WIN32 AND _MIT_VERSION) + set(GSS_VERSION "${_MIT_VERSION}") + else() + set(GSS_VERSION "MIT Unknown") + endif() + endif() +endif() + +include(FindPackageHandleStandardArgs) + +set(_GSS_REQUIRED_VARS GSS_LIBRARIES GSS_FLAVOUR) + +find_package_handle_standard_args(GSS + REQUIRED_VARS + ${_GSS_REQUIRED_VARS} + VERSION_VAR + GSS_VERSION + FAIL_MESSAGE + "Could NOT find GSS, try to set the path to GSS root folder in the system variable GSS_ROOT_DIR" +) + +mark_as_advanced(GSS_INCLUDE_DIR GSS_LIBRARIES) diff --git a/CMake/FindLibSSH2.cmake b/CMake/FindLibSSH2.cmake new file mode 100644 index 0000000000..91e17c1db1 --- /dev/null +++ b/CMake/FindLibSSH2.cmake @@ -0,0 +1,22 @@ +# - Try to find the libssh2 library +# Once done this will define +# +# LIBSSH2_FOUND - system has the libssh2 library +# LIBSSH2_INCLUDE_DIR - the libssh2 include directory +# LIBSSH2_LIBRARY - the libssh2 library name + +find_path(LIBSSH2_INCLUDE_DIR libssh2.h) + +find_library(LIBSSH2_LIBRARY NAMES ssh2 libssh2) + +if(LIBSSH2_INCLUDE_DIR) + file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION[\t ]+\"(.*)\"") + string(REGEX REPLACE "^.*\"([^\"]+)\"" "\\1" LIBSSH2_VERSION "${libssh2_version_str}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibSSH2 + REQUIRED_VARS LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR + VERSION_VAR LIBSSH2_VERSION) + +mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY) diff --git a/CMake/FindMbedTLS.cmake b/CMake/FindMbedTLS.cmake new file mode 100644 index 0000000000..a916395892 --- /dev/null +++ b/CMake/FindMbedTLS.cmake @@ -0,0 +1,13 @@ +find_path(MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h) + +find_library(MBEDTLS_LIBRARY mbedtls) +find_library(MBEDX509_LIBRARY mbedx509) +find_library(MBEDCRYPTO_LIBRARY mbedcrypto) + +set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MBEDTLS DEFAULT_MSG + MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) + +mark_as_advanced(MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) diff --git a/CMake/FindNGHTTP2.cmake b/CMake/FindNGHTTP2.cmake new file mode 100644 index 0000000000..5138e99999 --- /dev/null +++ b/CMake/FindNGHTTP2.cmake @@ -0,0 +1,18 @@ +include(FindPackageHandleStandardArgs) + +find_path(NGHTTP2_INCLUDE_DIR "nghttp2/nghttp2.h") + +find_library(NGHTTP2_LIBRARY NAMES nghttp2) + +find_package_handle_standard_args(NGHTTP2 + FOUND_VAR + NGHTTP2_FOUND + REQUIRED_VARS + NGHTTP2_LIBRARY + NGHTTP2_INCLUDE_DIR +) + +set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INCLUDE_DIR}) +set(NGHTTP2_LIBRARIES ${NGHTTP2_LIBRARY}) + +mark_as_advanced(NGHTTP2_INCLUDE_DIRS NGHTTP2_LIBRARIES) diff --git a/CMake/FindNSS.cmake b/CMake/FindNSS.cmake new file mode 100644 index 0000000000..0043ce8531 --- /dev/null +++ b/CMake/FindNSS.cmake @@ -0,0 +1,17 @@ +if(UNIX) + find_package(PkgConfig QUIET) + pkg_search_module(PC_NSS nss) +endif() +if(NOT PC_NSS_FOUND) + return() +endif() + +set(NSS_LIBRARIES ${PC_NSS_LINK_LIBRARIES}) +set(NSS_INCLUDE_DIRS ${PC_NSS_INCLUDE_DIRS}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NSS + REQUIRED_VARS NSS_LIBRARIES NSS_INCLUDE_DIRS + VERSION_VAR PC_NSS_VERSION) + +mark_as_advanced(NSS_INCLUDE_DIRS NSS_LIBRARIES) diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake new file mode 100644 index 0000000000..7f71345156 --- /dev/null +++ b/CMake/Macros.cmake @@ -0,0 +1,88 @@ +#File defines convenience macros for available feature testing + +# This macro checks if the symbol exists in the library and if it +# does, it prepends library to the list. It is intended to be called +# multiple times with a sequence of possibly dependent libraries in +# order of least-to-most-dependent. Some libraries depend on others +# to link correctly. +macro(check_library_exists_concat LIBRARY SYMBOL VARIABLE) + check_library_exists("${LIBRARY};${CURL_LIBS}" ${SYMBOL} "${CMAKE_LIBRARY_PATH}" + ${VARIABLE}) + if(${VARIABLE}) + set(CURL_LIBS ${LIBRARY} ${CURL_LIBS}) + endif() +endmacro() + +# Check if header file exists and add it to the list. +# This macro is intended to be called multiple times with a sequence of +# possibly dependent header files. Some headers depend on others to be +# compiled correctly. +macro(check_include_file_concat FILE VARIABLE) + check_include_files("${CURL_INCLUDES};${FILE}" ${VARIABLE}) + if(${VARIABLE}) + set(CURL_INCLUDES ${CURL_INCLUDES} ${FILE}) + set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D${VARIABLE}") + endif() +endmacro() + +# For other curl specific tests, use this macro. +macro(curl_internal_test CURL_TEST) + if(NOT DEFINED "${CURL_TEST}") + set(MACRO_CHECK_FUNCTION_DEFINITIONS + "-D${CURL_TEST} ${CURL_TEST_DEFINES} ${CMAKE_REQUIRED_FLAGS}") + if(CMAKE_REQUIRED_LIBRARIES) + set(CURL_TEST_ADD_LIBRARIES + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") + endif() + + message(STATUS "Performing Curl Test ${CURL_TEST}") + try_compile(${CURL_TEST} + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/CurlTests.c + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} + "${CURL_TEST_ADD_LIBRARIES}" + OUTPUT_VARIABLE OUTPUT) + if(${CURL_TEST}) + set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}") + message(STATUS "Performing Curl Test ${CURL_TEST} - Success") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Performing Curl Test ${CURL_TEST} passed with the following output:\n" + "${OUTPUT}\n") + else() + message(STATUS "Performing Curl Test ${CURL_TEST} - Failed") + set(${CURL_TEST} "" CACHE INTERNAL "Curl test ${FUNCTION}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Performing Curl Test ${CURL_TEST} failed with the following output:\n" + "${OUTPUT}\n") + endif() + endif() +endmacro() + +macro(curl_nroff_check) + find_program(NROFF NAMES gnroff nroff) + if(NROFF) + # Need a way to write to stdin, this will do + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" "test") + # Tests for a valid nroff option to generate a manpage + foreach(_MANOPT "-man" "-mandoc") + execute_process(COMMAND "${NROFF}" ${_MANOPT} + OUTPUT_VARIABLE NROFF_MANOPT_OUTPUT + INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" + ERROR_QUIET) + # Save the option if it was valid + if(NROFF_MANOPT_OUTPUT) + message("Found *nroff option: -- ${_MANOPT}") + set(NROFF_MANOPT ${_MANOPT}) + set(NROFF_USEFUL ON) + break() + endif() + endforeach() + # No need for the temporary file + file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt") + if(NOT NROFF_USEFUL) + message(WARNING "Found no *nroff option to get plaintext from man pages") + endif() + else() + message(WARNING "Found no *nroff program") + endif() +endmacro() diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake new file mode 100644 index 0000000000..8b150290c7 --- /dev/null +++ b/CMake/OtherTests.cmake @@ -0,0 +1,264 @@ +include(CheckCSourceCompiles) +# The begin of the sources (macros and includes) +set(_source_epilogue "#undef inline") + +macro(add_header_include check header) + if(${check}) + set(_source_epilogue "${_source_epilogue}\n#include <${header}>") + endif() +endmacro() + +set(signature_call_conv) +if(HAVE_WINDOWS_H) + add_header_include(HAVE_WINSOCK2_H "winsock2.h") + add_header_include(HAVE_WINDOWS_H "windows.h") + add_header_include(HAVE_WINSOCK_H "winsock.h") + set(_source_epilogue + "${_source_epilogue}\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif") + set(signature_call_conv "PASCAL") + if(HAVE_LIBWS2_32) + set(CMAKE_REQUIRED_LIBRARIES ws2_32) + endif() +else() + add_header_include(HAVE_SYS_TYPES_H "sys/types.h") + add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h") +endif() + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +check_c_source_compiles("${_source_epilogue} +int main(void) { + recv(0, 0, 0, 0); + return 0; +}" curl_cv_recv) +if(curl_cv_recv) + if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown") + foreach(recv_retv "int" "ssize_t" ) + foreach(recv_arg1 "SOCKET" "int" ) + foreach(recv_arg2 "char *" "void *" ) + foreach(recv_arg3 "int" "size_t" "socklen_t" "unsigned int") + foreach(recv_arg4 "int" "unsigned int") + if(NOT curl_cv_func_recv_done) + unset(curl_cv_func_recv_test CACHE) + check_c_source_compiles(" + ${_source_epilogue} + extern ${recv_retv} ${signature_call_conv} + recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4}); + int main(void) { + ${recv_arg1} s=0; + ${recv_arg2} buf=0; + ${recv_arg3} len=0; + ${recv_arg4} flags=0; + ${recv_retv} res = recv(s, buf, len, flags); + (void) res; + return 0; + }" + curl_cv_func_recv_test) + message(STATUS + "Tested: ${recv_retv} recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4})") + if(curl_cv_func_recv_test) + set(curl_cv_func_recv_args + "${recv_arg1},${recv_arg2},${recv_arg3},${recv_arg4},${recv_retv}") + set(RECV_TYPE_ARG1 "${recv_arg1}") + set(RECV_TYPE_ARG2 "${recv_arg2}") + set(RECV_TYPE_ARG3 "${recv_arg3}") + set(RECV_TYPE_ARG4 "${recv_arg4}") + set(RECV_TYPE_RETV "${recv_retv}") + set(HAVE_RECV 1) + set(curl_cv_func_recv_done 1) + endif() + endif() + endforeach() + endforeach() + endforeach() + endforeach() + endforeach() + else() + string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG1 "${curl_cv_func_recv_args}") + string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG2 "${curl_cv_func_recv_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" RECV_TYPE_ARG3 "${curl_cv_func_recv_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" RECV_TYPE_ARG4 "${curl_cv_func_recv_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" RECV_TYPE_RETV "${curl_cv_func_recv_args}") + endif() + + if(curl_cv_func_recv_args STREQUAL "unknown") + message(FATAL_ERROR "Cannot find proper types to use for recv args") + endif() +else() + message(FATAL_ERROR "Unable to link function recv") +endif() +set(curl_cv_func_recv_args "${curl_cv_func_recv_args}" CACHE INTERNAL "Arguments for recv") +set(HAVE_RECV 1) + +check_c_source_compiles("${_source_epilogue} +int main(void) { + send(0, 0, 0, 0); + return 0; +}" curl_cv_send) +if(curl_cv_send) + if(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown") + foreach(send_retv "int" "ssize_t" ) + foreach(send_arg1 "SOCKET" "int" "ssize_t" ) + foreach(send_arg2 "const char *" "const void *" "void *" "char *") + foreach(send_arg3 "int" "size_t" "socklen_t" "unsigned int") + foreach(send_arg4 "int" "unsigned int") + if(NOT curl_cv_func_send_done) + unset(curl_cv_func_send_test CACHE) + check_c_source_compiles(" + ${_source_epilogue} + extern ${send_retv} ${signature_call_conv} + send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4}); + int main(void) { + ${send_arg1} s=0; + ${send_arg2} buf=0; + ${send_arg3} len=0; + ${send_arg4} flags=0; + ${send_retv} res = send(s, buf, len, flags); + (void) res; + return 0; + }" + curl_cv_func_send_test) + message(STATUS + "Tested: ${send_retv} send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4})") + if(curl_cv_func_send_test) + string(REGEX REPLACE "(const) .*" "\\1" send_qual_arg2 "${send_arg2}") + string(REGEX REPLACE "const (.*)" "\\1" send_arg2 "${send_arg2}") + set(curl_cv_func_send_args + "${send_arg1},${send_arg2},${send_arg3},${send_arg4},${send_retv},${send_qual_arg2}") + set(SEND_TYPE_ARG1 "${send_arg1}") + set(SEND_TYPE_ARG2 "${send_arg2}") + set(SEND_TYPE_ARG3 "${send_arg3}") + set(SEND_TYPE_ARG4 "${send_arg4}") + set(SEND_TYPE_RETV "${send_retv}") + set(HAVE_SEND 1) + set(curl_cv_func_send_done 1) + endif() + endif() + endforeach() + endforeach() + endforeach() + endforeach() + endforeach() + else() + string(REGEX REPLACE "^([^,]*),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG1 "${curl_cv_func_send_args}") + string(REGEX REPLACE "^[^,]*,([^,]*),[^,]*,[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG2 "${curl_cv_func_send_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,([^,]*),[^,]*,[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG3 "${curl_cv_func_send_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,([^,]*),[^,]*,[^,]*$" "\\1" SEND_TYPE_ARG4 "${curl_cv_func_send_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),[^,]*$" "\\1" SEND_TYPE_RETV "${curl_cv_func_send_args}") + string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" SEND_QUAL_ARG2 "${curl_cv_func_send_args}") + endif() + + if("${curl_cv_func_send_args}" STREQUAL "unknown") + message(FATAL_ERROR "Cannot find proper types to use for send args") + endif() + set(SEND_QUAL_ARG2 "const") +else() + message(FATAL_ERROR "Unable to link function send") +endif() +set(curl_cv_func_send_args "${curl_cv_func_send_args}" CACHE INTERNAL "Arguments for send") +set(HAVE_SEND 1) + +check_c_source_compiles("${_source_epilogue} + int main(void) { + int flag = MSG_NOSIGNAL; + (void)flag; + return 0; + }" HAVE_MSG_NOSIGNAL) + +if(NOT HAVE_WINDOWS_H) + add_header_include(HAVE_SYS_TIME_H "sys/time.h") + add_header_include(TIME_WITH_SYS_TIME "time.h") + add_header_include(HAVE_TIME_H "time.h") +endif() +check_c_source_compiles("${_source_epilogue} +int main(void) { + struct timeval ts; + ts.tv_sec = 0; + ts.tv_usec = 0; + (void)ts; + return 0; +}" HAVE_STRUCT_TIMEVAL) + +set(HAVE_SIG_ATOMIC_T 1) +set(CMAKE_REQUIRED_FLAGS) +if(HAVE_SIGNAL_H) + set(CMAKE_REQUIRED_FLAGS "-DHAVE_SIGNAL_H") + set(CMAKE_EXTRA_INCLUDE_FILES "signal.h") +endif() +check_type_size("sig_atomic_t" SIZEOF_SIG_ATOMIC_T) +if(HAVE_SIZEOF_SIG_ATOMIC_T) + check_c_source_compiles(" + #ifdef HAVE_SIGNAL_H + # include + #endif + int main(void) { + static volatile sig_atomic_t dummy = 0; + (void)dummy; + return 0; + }" HAVE_SIG_ATOMIC_T_NOT_VOLATILE) + if(NOT HAVE_SIG_ATOMIC_T_NOT_VOLATILE) + set(HAVE_SIG_ATOMIC_T_VOLATILE 1) + endif() +endif() + +if(HAVE_WINDOWS_H) + set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h) +else() + set(CMAKE_EXTRA_INCLUDE_FILES) + if(HAVE_SYS_SOCKET_H) + set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) + endif() +endif() + +check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE) +if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE) + set(HAVE_STRUCT_SOCKADDR_STORAGE 1) +endif() + +unset(CMAKE_TRY_COMPILE_TARGET_TYPE) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + # if not cross-compilation... + include(CheckCSourceRuns) + set(CMAKE_REQUIRED_FLAGS "") + if(HAVE_SYS_POLL_H) + set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H") + elseif(HAVE_POLL_H) + set(CMAKE_REQUIRED_FLAGS "-DHAVE_POLL_H") + endif() + check_c_source_runs(" + #include + #include + + #ifdef HAVE_SYS_POLL_H + # include + #elif HAVE_POLL_H + # include + #endif + + int main(void) + { + if(0 != poll(0, 0, 10)) { + return 1; /* fail */ + } + else { + /* detect the 10.12 poll() breakage */ + struct timeval before, after; + int rc; + size_t us; + + gettimeofday(&before, NULL); + rc = poll(NULL, 0, 500); + gettimeofday(&after, NULL); + + us = (after.tv_sec - before.tv_sec) * 1000000 + + (after.tv_usec - before.tv_usec); + + if(us < 400000) { + return 1; + } + } + return 0; + }" HAVE_POLL_FINE) +endif() + diff --git a/CMake/Platforms/WindowsCache.cmake b/CMake/Platforms/WindowsCache.cmake new file mode 100644 index 0000000000..ead4115a31 --- /dev/null +++ b/CMake/Platforms/WindowsCache.cmake @@ -0,0 +1,123 @@ +if(NOT UNIX) + if(WIN32) + set(HAVE_LIBDL 0) + set(HAVE_LIBUCB 0) + set(HAVE_LIBSOCKET 0) + set(NOT_NEED_LIBNSL 0) + set(HAVE_LIBNSL 0) + set(HAVE_GETHOSTNAME 1) + set(HAVE_LIBZ 0) + + set(HAVE_DLOPEN 0) + + set(HAVE_ALLOCA_H 0) + set(HAVE_ARPA_INET_H 0) + set(HAVE_DLFCN_H 0) + set(HAVE_FCNTL_H 1) + set(HAVE_INTTYPES_H 0) + set(HAVE_IO_H 1) + set(HAVE_MALLOC_H 1) + set(HAVE_MEMORY_H 1) + set(HAVE_NETDB_H 0) + set(HAVE_NETINET_IF_ETHER_H 0) + set(HAVE_NETINET_IN_H 0) + set(HAVE_NET_IF_H 0) + set(HAVE_PROCESS_H 1) + set(HAVE_PWD_H 0) + set(HAVE_SETJMP_H 1) + set(HAVE_SGTTY_H 0) + set(HAVE_SIGNAL_H 1) + set(HAVE_SOCKIO_H 0) + set(HAVE_STDINT_H 0) + set(HAVE_STDLIB_H 1) + set(HAVE_STRINGS_H 0) + set(HAVE_STRING_H 1) + set(HAVE_SYS_PARAM_H 0) + set(HAVE_SYS_POLL_H 0) + set(HAVE_SYS_SELECT_H 0) + set(HAVE_SYS_SOCKET_H 0) + set(HAVE_SYS_SOCKIO_H 0) + set(HAVE_SYS_STAT_H 1) + set(HAVE_SYS_TIME_H 0) + set(HAVE_SYS_TYPES_H 1) + set(HAVE_SYS_UTIME_H 1) + set(HAVE_TERMIOS_H 0) + set(HAVE_TERMIO_H 0) + set(HAVE_TIME_H 1) + set(HAVE_UNISTD_H 0) + set(HAVE_UTIME_H 0) + set(HAVE_X509_H 0) + set(HAVE_ZLIB_H 0) + + set(HAVE_SIZEOF_LONG_DOUBLE 1) + set(SIZEOF_LONG_DOUBLE 8) + + set(HAVE_SOCKET 1) + set(HAVE_POLL 0) + set(HAVE_SELECT 1) + set(HAVE_STRDUP 1) + set(HAVE_STRSTR 1) + set(HAVE_STRTOK_R 0) + set(HAVE_STRFTIME 1) + set(HAVE_UNAME 0) + set(HAVE_STRCASECMP 0) + set(HAVE_STRICMP 1) + set(HAVE_STRCMPI 1) + set(HAVE_GETHOSTBYADDR 1) + set(HAVE_GETTIMEOFDAY 0) + set(HAVE_INET_ADDR 1) + set(HAVE_INET_NTOA 1) + set(HAVE_INET_NTOA_R 0) + set(HAVE_TCGETATTR 0) + set(HAVE_TCSETATTR 0) + set(HAVE_PERROR 1) + set(HAVE_CLOSESOCKET 1) + set(HAVE_SETVBUF 0) + set(HAVE_SIGSETJMP 0) + set(HAVE_GETPASS_R 0) + set(HAVE_STRLCAT 0) + set(HAVE_GETPWUID 0) + set(HAVE_GETEUID 0) + set(HAVE_UTIME 1) + set(HAVE_RAND_EGD 0) + set(HAVE_RAND_SCREEN 0) + set(HAVE_RAND_STATUS 0) + set(HAVE_GMTIME_R 0) + set(HAVE_LOCALTIME_R 0) + set(HAVE_GETHOSTBYADDR_R 0) + set(HAVE_GETHOSTBYNAME_R 0) + set(HAVE_SIGNAL_FUNC 1) + set(HAVE_SIGNAL_MACRO 0) + + set(HAVE_GETHOSTBYADDR_R_5 0) + set(HAVE_GETHOSTBYADDR_R_5_REENTRANT 0) + set(HAVE_GETHOSTBYADDR_R_7 0) + set(HAVE_GETHOSTBYADDR_R_7_REENTRANT 0) + set(HAVE_GETHOSTBYADDR_R_8 0) + set(HAVE_GETHOSTBYADDR_R_8_REENTRANT 0) + set(HAVE_GETHOSTBYNAME_R_3 0) + set(HAVE_GETHOSTBYNAME_R_3_REENTRANT 0) + set(HAVE_GETHOSTBYNAME_R_5 0) + set(HAVE_GETHOSTBYNAME_R_5_REENTRANT 0) + set(HAVE_GETHOSTBYNAME_R_6 0) + set(HAVE_GETHOSTBYNAME_R_6_REENTRANT 0) + + set(TIME_WITH_SYS_TIME 0) + set(HAVE_O_NONBLOCK 0) + set(HAVE_IN_ADDR_T 0) + set(HAVE_INET_NTOA_R_DECL 0) + set(HAVE_INET_NTOA_R_DECL_REENTRANT 0) + if(ENABLE_IPV6) + set(HAVE_GETADDRINFO 1) + else() + set(HAVE_GETADDRINFO 0) + endif() + set(STDC_HEADERS 1) + set(RETSIGTYPE_TEST 1) + + set(HAVE_SIGACTION 0) + set(HAVE_MACRO_SIGSETJMP 0) + else() + message("This file should be included on Windows platform only") + endif() +endif() diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake new file mode 100644 index 0000000000..ffc411ae98 --- /dev/null +++ b/CMake/Utilities.cmake @@ -0,0 +1,12 @@ +# File containing various utilities + +# Returns a list of arguments that evaluate to true +function(count_true output_count_var) + set(lst_len 0) + foreach(option_var IN LISTS ARGN) + if(${option_var}) + math(EXPR lst_len "${lst_len} + 1") + endif() + endforeach() + set(${output_count_var} ${lst_len} PARENT_SCOPE) +endfunction() diff --git a/CMake/cmake_uninstall.cmake.in b/CMake/cmake_uninstall.cmake.in new file mode 100644 index 0000000000..db8e5367db --- /dev/null +++ b/CMake/cmake_uninstall.cmake.in @@ -0,0 +1,26 @@ +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif() + +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@") +endif() +message(${CMAKE_INSTALL_PREFIX}) + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif() + else() + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif() +endforeach() diff --git a/CMake/curl-config.cmake.in b/CMake/curl-config.cmake.in new file mode 100644 index 0000000000..1294e173a0 --- /dev/null +++ b/CMake/curl-config.cmake.in @@ -0,0 +1,12 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +if(@USE_OPENSSL@) + find_dependency(OpenSSL @OPENSSL_VERSION_MAJOR@) +endif() +if(@USE_ZLIB@) + find_dependency(ZLIB @ZLIB_VERSION_MAJOR@) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..73b053b315 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,1423 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +########################################################################### +# curl/libcurl CMake script +# by Tetetest and Sukender (Benoit Neil) + +# TODO: +# The output .so file lacks the soname number which we currently have within the lib/Makefile.am file +# Add full (4 or 5 libs) SSL support +# Add INSTALL target (EXTRA_DIST variables in Makefile.am may be moved to Makefile.inc so that CMake/CPack is aware of what's to include). +# Add CTests(?) +# Check on all possible platforms +# Test with as many configurations possible (With or without any option) +# Create scripts that help keeping the CMake build system up to date (to reduce maintenance). According to Tetetest: +# - lists of headers that 'configure' checks for; +# - curl-specific tests (the ones that are in m4/curl-*.m4 files); +# - (most obvious thing:) curl version numbers. +# Add documentation subproject +# +# To check: +# (From Daniel Stenberg) The cmake build selected to run gcc with -fPIC on my box while the plain configure script did not. +# (From Daniel Stenberg) The gcc command line use neither -g nor any -O options. As a developer, I also treasure our configure scripts's --enable-debug option that sets a long range of "picky" compiler options. +cmake_minimum_required(VERSION 3.0...3.16 FATAL_ERROR) + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}") +include(Utilities) +include(Macros) +include(CMakeDependentOption) +include(CheckCCompilerFlag) + +project(CURL C) + +message(WARNING "the curl cmake build system is poorly maintained. Be aware") + +file(STRINGS ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )") +string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*" + CURL_VERSION ${CURL_VERSION_H_CONTENTS}) +string(REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION}) +string(REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+" + CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS}) +string(REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM}) + + +# Setup package meta-data +# SET(PACKAGE "curl") +message(STATUS "curl version=[${CURL_VERSION}]") +# SET(PACKAGE_TARNAME "curl") +# SET(PACKAGE_NAME "curl") +# SET(PACKAGE_VERSION "-") +# SET(PACKAGE_STRING "curl-") +# SET(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.haxx.se/mail/") +set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}") +set(OS "\"${CMAKE_SYSTEM_NAME}\"") + +include_directories(${CURL_SOURCE_DIR}/include) + +option(CURL_WERROR "Turn compiler warnings into errors" OFF) +option(PICKY_COMPILER "Enable picky compiler options" ON) +option(BUILD_CURL_EXE "Set to ON to build curl executable." ON) +option(BUILD_SHARED_LIBS "Build shared libraries" ON) +option(ENABLE_ARES "Set to ON to enable c-ares support" OFF) +if(WIN32) + option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF) + option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON) + set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string") + if(CURL_TARGET_WINDOWS_VERSION) + add_definitions(-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}) + elseif(ENABLE_INET_PTON) + # _WIN32_WINNT_VISTA (0x0600) + add_definitions(-D_WIN32_WINNT=0x0600) + else() + # _WIN32_WINNT_WINXP (0x0501) + add_definitions(-D_WIN32_WINNT=0x0501) + endif() +endif() +option(CURL_LTO "Turn on compiler Link Time Optimizations" OFF) + +cmake_dependent_option(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup" + ON "NOT ENABLE_ARES" + OFF) + +option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF) +option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF) + +if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG) + if(PICKY_COMPILER) + foreach(_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers -Wno-pedantic-ms-format) + # surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new + # test result in. + string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname) + check_c_compiler_flag(${_CCOPT} ${_optvarname}) + if(${_optvarname}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}") + endif() + endforeach() + endif() +endif() + +if(ENABLE_DEBUG) + # DEBUGBUILD will be defined only for Debug builds + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$:DEBUGBUILD>) + set(ENABLE_CURLDEBUG ON) +endif() + +if(ENABLE_CURLDEBUG) + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG) +endif() + +# For debug libs and exes, add "-d" postfix +if(NOT DEFINED CMAKE_DEBUG_POSTFIX) + set(CMAKE_DEBUG_POSTFIX "-d") +endif() + +# initialize CURL_LIBS +set(CURL_LIBS "") + +if(ENABLE_ARES) + set(USE_ARES 1) + find_package(CARES REQUIRED) + list(APPEND CURL_LIBS ${CARES_LIBRARY}) +endif() + +include(CurlSymbolHiding) + +option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF) +mark_as_advanced(HTTP_ONLY) +option(CURL_DISABLE_FTP "disables FTP" OFF) +mark_as_advanced(CURL_DISABLE_FTP) +option(CURL_DISABLE_LDAP "disables LDAP" OFF) +mark_as_advanced(CURL_DISABLE_LDAP) +option(CURL_DISABLE_TELNET "disables Telnet" OFF) +mark_as_advanced(CURL_DISABLE_TELNET) +option(CURL_DISABLE_DICT "disables DICT" OFF) +mark_as_advanced(CURL_DISABLE_DICT) +option(CURL_DISABLE_FILE "disables FILE" OFF) +mark_as_advanced(CURL_DISABLE_FILE) +option(CURL_DISABLE_TFTP "disables TFTP" OFF) +mark_as_advanced(CURL_DISABLE_TFTP) +option(CURL_DISABLE_HTTP "disables HTTP" OFF) +mark_as_advanced(CURL_DISABLE_HTTP) + +option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF) +mark_as_advanced(CURL_DISABLE_LDAPS) + +option(CURL_DISABLE_RTSP "to disable RTSP" OFF) +mark_as_advanced(CURL_DISABLE_RTSP) +option(CURL_DISABLE_PROXY "to disable proxy" OFF) +mark_as_advanced(CURL_DISABLE_PROXY) +option(CURL_DISABLE_POP3 "to disable POP3" OFF) +mark_as_advanced(CURL_DISABLE_POP3) +option(CURL_DISABLE_IMAP "to disable IMAP" OFF) +mark_as_advanced(CURL_DISABLE_IMAP) +option(CURL_DISABLE_SMTP "to disable SMTP" OFF) +mark_as_advanced(CURL_DISABLE_SMTP) +option(CURL_DISABLE_GOPHER "to disable Gopher" OFF) +mark_as_advanced(CURL_DISABLE_GOPHER) + +if(HTTP_ONLY) + set(CURL_DISABLE_FTP ON) + set(CURL_DISABLE_LDAP ON) + set(CURL_DISABLE_LDAPS ON) + set(CURL_DISABLE_TELNET ON) + set(CURL_DISABLE_DICT ON) + set(CURL_DISABLE_FILE ON) + set(CURL_DISABLE_TFTP ON) + set(CURL_DISABLE_RTSP ON) + set(CURL_DISABLE_POP3 ON) + set(CURL_DISABLE_IMAP ON) + set(CURL_DISABLE_SMB ON) + set(CURL_DISABLE_SMTP ON) + set(CURL_DISABLE_GOPHER ON) +endif() + +option(CURL_DISABLE_COOKIES "to disable cookies support" OFF) +mark_as_advanced(CURL_DISABLE_COOKIES) + +option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF) +mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH) +option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF) +mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS) +option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON) +mark_as_advanced(ENABLE_IPV6) +if(ENABLE_IPV6 AND NOT WIN32) + include(CheckStructHasMember) + check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h" + HAVE_SOCKADDR_IN6_SIN6_ADDR) + check_struct_has_member("struct sockaddr_in6" sin6_scope_id "netinet/in.h" + HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) + if(NOT HAVE_SOCKADDR_IN6_SIN6_ADDR) + message(WARNING "struct sockaddr_in6 not available, disabling IPv6 support") + # Force the feature off as this name is used as guard macro... + set(ENABLE_IPV6 OFF + CACHE BOOL "Define if you want to enable IPv6 support" FORCE) + endif() +endif() + +curl_nroff_check() +find_package(Perl) + +cmake_dependent_option(ENABLE_MANUAL "to provide the built-in manual" + ON "NROFF_USEFUL;PERL_FOUND" + OFF) + +if(NOT PERL_FOUND) + message(STATUS "Perl not found, testing disabled.") + set(BUILD_TESTING OFF) +endif() +if(ENABLE_MANUAL) + set(USE_MANUAL ON) +endif() + +# We need ansi c-flags, especially on HP +set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}") +set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS}) + +if(CURL_STATIC_CRT) + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") +endif() + +# Disable warnings on Borland to avoid changing 3rd party code. +if(BORLAND) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-") +endif() + +# If we are on AIX, do the _ALL_SOURCE magic +if(${CMAKE_SYSTEM_NAME} MATCHES AIX) + set(_ALL_SOURCE 1) +endif() + +# Include all the necessary files for macros +include(CMakePushCheckState) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CheckIncludeFiles) +include(CheckLibraryExists) +include(CheckSymbolExists) +include(CheckTypeSize) +include(CheckCSourceCompiles) + +# On windows preload settings +if(WIN32) + set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_=") + include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake) +endif() + +if(ENABLE_THREADED_RESOLVER) + find_package(Threads REQUIRED) + if(WIN32) + set(USE_THREADS_WIN32 ON) + else() + set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT}) + set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT}) + endif() + set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT}) +endif() + +# Check for all needed libraries +check_library_exists_concat("${CMAKE_DL_LIBS}" dlopen HAVE_LIBDL) +check_library_exists_concat("socket" connect HAVE_LIBSOCKET) +check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL) + +# Yellowtab Zeta needs different libraries than BeOS 5. +if(BEOS) + set(NOT_NEED_LIBNSL 1) + check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND) + check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI) +endif() + +if(NOT NOT_NEED_LIBNSL) + check_library_exists_concat("nsl" gethostbyname HAVE_LIBNSL) +endif() + +check_function_exists(gethostname HAVE_GETHOSTNAME) + +if(WIN32) + check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32) + check_library_exists_concat("winmm" getch HAVE_LIBWINMM) + list(APPEND CURL_LIBS "advapi32") +endif() + +# check SSL libraries +# TODO support GnuTLS and WolfSSL + +if(APPLE) + option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF) +endif() +if(WIN32) + option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF) + cmake_dependent_option(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON + CMAKE_USE_WINSSL OFF) +endif() +option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF) +option(CMAKE_USE_BEARSSL "Enable BearSSL for SSL/TLS" OFF) +option(CMAKE_USE_NSS "Enable NSS for SSL/TLS" OFF) + +set(openssl_default ON) +if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS OR CMAKE_USE_NSS) + set(openssl_default OFF) +endif() +option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default}) + +count_true(enabled_ssl_options_count + CMAKE_USE_WINSSL + CMAKE_USE_SECTRANSP + CMAKE_USE_OPENSSL + CMAKE_USE_MBEDTLS + CMAKE_USE_BEARSSL + CMAKE_USE_NSS +) +if(enabled_ssl_options_count GREATER "1") + set(CURL_WITH_MULTI_SSL ON) +endif() + +if(CMAKE_USE_WINSSL) + set(SSL_ENABLED ON) + set(USE_SCHANNEL ON) # Windows native SSL/TLS support + set(USE_WINDOWS_SSPI ON) # CMAKE_USE_WINSSL implies CURL_WINDOWS_SSPI + list(APPEND CURL_LIBS "crypt32") +endif() +if(CURL_WINDOWS_SSPI) + set(USE_WINDOWS_SSPI ON) + set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32") +endif() + +if(CMAKE_USE_DARWINSSL) + message(FATAL_ERROR "The cmake option CMAKE_USE_DARWINSSL was renamed to CMAKE_USE_SECTRANSP.") +endif() + +if(CMAKE_USE_SECTRANSP) + find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation") + if(NOT COREFOUNDATION_FRAMEWORK) + message(FATAL_ERROR "CoreFoundation framework not found") + endif() + + find_library(SECURITY_FRAMEWORK "Security") + if(NOT SECURITY_FRAMEWORK) + message(FATAL_ERROR "Security framework not found") + endif() + + set(SSL_ENABLED ON) + set(USE_SECTRANSP ON) + list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}") +endif() + +if(CMAKE_USE_OPENSSL) + find_package(OpenSSL REQUIRED) + set(SSL_ENABLED ON) + set(USE_OPENSSL ON) + + # Depend on OpenSSL via imported targets if supported by the running + # version of CMake. This allows our dependents to get our dependencies + # transitively. + if(NOT CMAKE_VERSION VERSION_LESS 3.4) + list(APPEND CURL_LIBS OpenSSL::SSL OpenSSL::Crypto) + else() + list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES}) + include_directories(${OPENSSL_INCLUDE_DIR}) + endif() + + set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) + check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H) + check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H) + check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H) + check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H) + check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H) + check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H) + check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H) + check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS) + check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN) + check_symbol_exists(RAND_egd "${CURL_INCLUDES}" HAVE_RAND_EGD) +endif() + +if(CMAKE_USE_MBEDTLS) + find_package(MbedTLS REQUIRED) + set(SSL_ENABLED ON) + set(USE_MBEDTLS ON) + list(APPEND CURL_LIBS ${MBEDTLS_LIBRARIES}) + include_directories(${MBEDTLS_INCLUDE_DIRS}) +endif() + +if(CMAKE_USE_BEARSSL) + find_package(BearSSL REQUIRED) + set(SSL_ENABLED ON) + set(USE_BEARSSL ON) + list(APPEND CURL_LIBS ${BEARSSL_LIBRARY}) + include_directories(${BEARSSL_INCLUDE_DIRS}) +endif() + +if(CMAKE_USE_NSS) + find_package(NSS REQUIRED) + include_directories(${NSS_INCLUDE_DIRS}) + list(APPEND CURL_LIBS ${NSS_LIBRARIES}) + set(SSL_ENABLED ON) + set(USE_NSS ON) + cmake_push_check_state() + set(CMAKE_REQUIRED_INCLUDES ${NSS_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LIBRARIES ${NSS_LIBRARIES}) + check_symbol_exists(PK11_CreateManagedGenericObject "pk11pub.h" HAVE_PK11_CREATEMANAGEDGENERICOBJECT) + cmake_pop_check_state() +endif() + +option(USE_NGHTTP2 "Use Nghttp2 library" OFF) +if(USE_NGHTTP2) + find_package(NGHTTP2 REQUIRED) + include_directories(${NGHTTP2_INCLUDE_DIRS}) + list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES}) +endif() + +if(WIN32) + set(USE_WIN32_CRYPTO ON) +endif() + +if(NOT CURL_DISABLE_LDAP) + if(WIN32) + option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON) + if(USE_WIN32_LDAP) + check_library_exists_concat("wldap32" cldap_open HAVE_WLDAP32) + if(NOT HAVE_WLDAP32) + set(USE_WIN32_LDAP OFF) + endif() + endif() + endif() + + option(CMAKE_USE_OPENLDAP "Use OpenLDAP code." OFF) + mark_as_advanced(CMAKE_USE_OPENLDAP) + set(CMAKE_LDAP_LIB "ldap" CACHE STRING "Name or full path to ldap library") + set(CMAKE_LBER_LIB "lber" CACHE STRING "Name or full path to lber library") + + if(CMAKE_USE_OPENLDAP AND USE_WIN32_LDAP) + message(FATAL_ERROR "Cannot use USE_WIN32_LDAP and CMAKE_USE_OPENLDAP at the same time") + endif() + + # Now that we know, we're not using windows LDAP... + if(USE_WIN32_LDAP) + check_include_file_concat("winldap.h" HAVE_WINLDAP_H) + check_include_file_concat("winber.h" HAVE_WINBER_H) + else() + # Check for LDAP + set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES}) + check_library_exists_concat(${CMAKE_LDAP_LIB} ldap_init HAVE_LIBLDAP) + check_library_exists_concat(${CMAKE_LBER_LIB} ber_init HAVE_LIBLBER) + + set(CMAKE_REQUIRED_INCLUDES_BAK ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory") + if(CMAKE_LDAP_INCLUDE_DIR) + list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR}) + endif() + check_include_file_concat("ldap.h" HAVE_LDAP_H) + check_include_file_concat("lber.h" HAVE_LBER_H) + + if(NOT HAVE_LDAP_H) + message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON") + set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) + set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used + elseif(NOT HAVE_LIBLDAP) + message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON") + set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) + set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used + else() + if(CMAKE_USE_OPENLDAP) + set(USE_OPENLDAP ON) + endif() + if(CMAKE_LDAP_INCLUDE_DIR) + include_directories(${CMAKE_LDAP_INCLUDE_DIR}) + endif() + set(NEED_LBER_H ON) + set(_HEADER_LIST) + if(HAVE_WINDOWS_H) + list(APPEND _HEADER_LIST "windows.h") + endif() + if(HAVE_SYS_TYPES_H) + list(APPEND _HEADER_LIST "sys/types.h") + endif() + list(APPEND _HEADER_LIST "ldap.h") + + set(_SRC_STRING "") + foreach(_HEADER ${_HEADER_LIST}) + set(_INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n") + endforeach() + + set(_SRC_STRING + " + ${_INCLUDE_STRING} + int main(int argc, char ** argv) + { + BerValue *bvp = NULL; + BerElement *bep = ber_init(bvp); + ber_free(bep, 1); + return 0; + }" + ) + set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DLDAP_DEPRECATED=1") + list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LDAP_LIB}) + if(HAVE_LIBLBER) + list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB}) + endif() + check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H) + unset(CMAKE_REQUIRED_LIBRARIES) + + if(NOT_NEED_LBER_H) + set(NEED_LBER_H OFF) + else() + set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H") + endif() + endif() + endif() +endif() + +# No ldap, no ldaps. +if(CURL_DISABLE_LDAP) + if(NOT CURL_DISABLE_LDAPS) + message(STATUS "LDAP needs to be enabled to support LDAPS") + set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE) + endif() +endif() + +if(NOT CURL_DISABLE_LDAPS) + check_include_file_concat("ldap_ssl.h" HAVE_LDAP_SSL_H) + check_include_file_concat("ldapssl.h" HAVE_LDAPSSL_H) +endif() + +# Check for idn +check_library_exists_concat("idn2" idn2_lookup_ul HAVE_LIBIDN2) + +# Check for symbol dlopen (same as HAVE_LIBDL) +check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN) + +option(CURL_ZLIB "Set to ON to enable building curl with zlib support." ON) +set(HAVE_LIBZ OFF) +set(HAVE_ZLIB_H OFF) +set(USE_ZLIB OFF) +if(CURL_ZLIB) + find_package(ZLIB QUIET) + if(ZLIB_FOUND) + set(HAVE_ZLIB_H ON) + set(HAVE_LIBZ ON) + set(USE_ZLIB ON) + + # Depend on ZLIB via imported targets if supported by the running + # version of CMake. This allows our dependents to get our dependencies + # transitively. + if(NOT CMAKE_VERSION VERSION_LESS 3.4) + list(APPEND CURL_LIBS ZLIB::ZLIB) + else() + list(APPEND CURL_LIBS ${ZLIB_LIBRARIES}) + include_directories(${ZLIB_INCLUDE_DIRS}) + endif() + list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS}) + endif() +endif() + +option(CURL_BROTLI "Set to ON to enable building curl with brotli support." OFF) +set(HAVE_BROTLI OFF) +if(CURL_BROTLI) + find_package(Brotli QUIET) + if(BROTLI_FOUND) + set(HAVE_BROTLI ON) + list(APPEND CURL_LIBS ${BROTLI_LIBRARIES}) + include_directories(${BROTLI_INCLUDE_DIRS}) + list(APPEND CMAKE_REQUIRED_INCLUDES ${BROTLI_INCLUDE_DIRS}) + endif() +endif() + +#libSSH2 +option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON) +mark_as_advanced(CMAKE_USE_LIBSSH2) +set(USE_LIBSSH2 OFF) +set(HAVE_LIBSSH2 OFF) +set(HAVE_LIBSSH2_H OFF) + +if(CMAKE_USE_LIBSSH2) + find_package(LibSSH2) + if(LIBSSH2_FOUND) + list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY}) + set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY}) + list(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}") + include_directories("${LIBSSH2_INCLUDE_DIR}") + set(HAVE_LIBSSH2 ON) + set(USE_LIBSSH2 ON) + + # find_package has already found the headers + set(HAVE_LIBSSH2_H ON) + set(CURL_INCLUDES ${CURL_INCLUDES} "${LIBSSH2_INCLUDE_DIR}/libssh2.h") + set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DHAVE_LIBSSH2_H") + + # now check for specific libssh2 symbols as they were added in different versions + set(CMAKE_EXTRA_INCLUDE_FILES "libssh2.h") + check_function_exists(libssh2_version HAVE_LIBSSH2_VERSION) + check_function_exists(libssh2_init HAVE_LIBSSH2_INIT) + check_function_exists(libssh2_exit HAVE_LIBSSH2_EXIT) + check_function_exists(libssh2_scp_send64 HAVE_LIBSSH2_SCP_SEND64) + check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE) + set(CMAKE_EXTRA_INCLUDE_FILES "") + unset(CMAKE_REQUIRED_LIBRARIES) + endif() +endif() + +option(CMAKE_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF) +mark_as_advanced(CMAKE_USE_GSSAPI) + +if(CMAKE_USE_GSSAPI) + find_package(GSS) + + set(HAVE_GSSAPI ${GSS_FOUND}) + if(GSS_FOUND) + + message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"") + + list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIR}) + check_include_file_concat("gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H) + check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H) + check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H) + + if(GSS_FLAVOUR STREQUAL "Heimdal") + set(HAVE_GSSHEIMDAL ON) + else() # MIT + set(HAVE_GSSMIT ON) + set(_INCLUDE_LIST "") + if(HAVE_GSSAPI_GSSAPI_H) + list(APPEND _INCLUDE_LIST "gssapi/gssapi.h") + endif() + if(HAVE_GSSAPI_GSSAPI_GENERIC_H) + list(APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h") + endif() + if(HAVE_GSSAPI_GSSAPI_KRB5_H) + list(APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h") + endif() + + string(REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}") + string(REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}") + + foreach(_dir ${GSS_LINK_DIRECTORIES}) + set(_LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\"${_dir}\"") + endforeach() + + set(CMAKE_REQUIRED_FLAGS "${_COMPILER_FLAGS_STR} ${_LINKER_FLAGS_STR}") + set(CMAKE_REQUIRED_LIBRARIES ${GSS_LIBRARIES}) + check_symbol_exists("GSS_C_NT_HOSTBASED_SERVICE" ${_INCLUDE_LIST} HAVE_GSS_C_NT_HOSTBASED_SERVICE) + if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE) + set(HAVE_OLD_GSSMIT ON) + endif() + unset(CMAKE_REQUIRED_LIBRARIES) + + endif() + + include_directories(${GSS_INCLUDE_DIR}) + link_directories(${GSS_LINK_DIRECTORIES}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GSS_LINKER_FLAGS}") + list(APPEND CURL_LIBS ${GSS_LIBRARIES}) + + else() + message(WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping.") + endif() +endif() + +option(ENABLE_UNIX_SOCKETS "Define if you want Unix domain sockets support" ON) +if(ENABLE_UNIX_SOCKETS) + include(CheckStructHasMember) + check_struct_has_member("struct sockaddr_un" sun_path "sys/un.h" USE_UNIX_SOCKETS) +else() + unset(USE_UNIX_SOCKETS CACHE) +endif() + +# +# CA handling +# +set(CURL_CA_BUNDLE "auto" CACHE STRING + "Path to the CA bundle. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.") +set(CURL_CA_FALLBACK OFF CACHE BOOL + "Set ON to use built-in CA store of TLS backend. Defaults to OFF") +set(CURL_CA_PATH "auto" CACHE STRING + "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.") + +if("${CURL_CA_BUNDLE}" STREQUAL "") + message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.") +elseif("${CURL_CA_BUNDLE}" STREQUAL "none") + unset(CURL_CA_BUNDLE CACHE) +elseif("${CURL_CA_BUNDLE}" STREQUAL "auto") + unset(CURL_CA_BUNDLE CACHE) + set(CURL_CA_BUNDLE_AUTODETECT TRUE) +else() + set(CURL_CA_BUNDLE_SET TRUE) +endif() + +if("${CURL_CA_PATH}" STREQUAL "") + message(FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path.") +elseif("${CURL_CA_PATH}" STREQUAL "none") + unset(CURL_CA_PATH CACHE) +elseif("${CURL_CA_PATH}" STREQUAL "auto") + unset(CURL_CA_PATH CACHE) + if(NOT USE_NSS) + set(CURL_CA_PATH_AUTODETECT TRUE) + endif() +else() + set(CURL_CA_PATH_SET TRUE) +endif() + +if(CURL_CA_BUNDLE_SET AND CURL_CA_PATH_AUTODETECT) + # Skip autodetection of unset CA path because CA bundle is set explicitly +elseif(CURL_CA_PATH_SET AND CURL_CA_BUNDLE_AUTODETECT) + # Skip autodetection of unset CA bundle because CA path is set explicitly +elseif(CURL_CA_PATH_AUTODETECT OR CURL_CA_BUNDLE_AUTODETECT) + # first try autodetecting a CA bundle, then a CA path + + if(CURL_CA_BUNDLE_AUTODETECT) + set(SEARCH_CA_BUNDLE_PATHS + /etc/ssl/certs/ca-certificates.crt + /etc/pki/tls/certs/ca-bundle.crt + /usr/share/ssl/certs/ca-bundle.crt + /usr/local/share/certs/ca-root-nss.crt + /etc/ssl/cert.pem) + + foreach(SEARCH_CA_BUNDLE_PATH ${SEARCH_CA_BUNDLE_PATHS}) + if(EXISTS "${SEARCH_CA_BUNDLE_PATH}") + message(STATUS "Found CA bundle: ${SEARCH_CA_BUNDLE_PATH}") + set(CURL_CA_BUNDLE "${SEARCH_CA_BUNDLE_PATH}") + set(CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Path to the CA bundle has been set") + break() + endif() + endforeach() + endif() + + if(CURL_CA_PATH_AUTODETECT AND (NOT CURL_CA_PATH_SET)) + if(EXISTS "/etc/ssl/certs") + set(CURL_CA_PATH "/etc/ssl/certs") + set(CURL_CA_PATH_SET TRUE CACHE BOOL "Path to the CA bundle has been set") + endif() + endif() +endif() + +if(CURL_CA_PATH_SET AND NOT USE_OPENSSL AND NOT USE_MBEDTLS) + message(FATAL_ERROR + "CA path only supported by OpenSSL, GnuTLS or mbed TLS. " + "Set CURL_CA_PATH=none or enable one of those TLS backends.") +endif() + +# Check for header files +if(NOT UNIX) + check_include_file_concat("windows.h" HAVE_WINDOWS_H) + check_include_file_concat("winsock.h" HAVE_WINSOCK_H) + check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H) + check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H) + if(NOT CURL_WINDOWS_SSPI AND USE_OPENSSL) + set(CURL_LIBS ${CURL_LIBS} "crypt32") + endif() +endif() + +check_include_file_concat("stdio.h" HAVE_STDIO_H) +check_include_file_concat("inttypes.h" HAVE_INTTYPES_H) +check_include_file_concat("sys/filio.h" HAVE_SYS_FILIO_H) +check_include_file_concat("sys/ioctl.h" HAVE_SYS_IOCTL_H) +check_include_file_concat("sys/param.h" HAVE_SYS_PARAM_H) +check_include_file_concat("sys/poll.h" HAVE_SYS_POLL_H) +check_include_file_concat("sys/resource.h" HAVE_SYS_RESOURCE_H) +check_include_file_concat("sys/select.h" HAVE_SYS_SELECT_H) +check_include_file_concat("sys/socket.h" HAVE_SYS_SOCKET_H) +check_include_file_concat("sys/sockio.h" HAVE_SYS_SOCKIO_H) +check_include_file_concat("sys/stat.h" HAVE_SYS_STAT_H) +check_include_file_concat("sys/time.h" HAVE_SYS_TIME_H) +check_include_file_concat("sys/types.h" HAVE_SYS_TYPES_H) +check_include_file_concat("sys/uio.h" HAVE_SYS_UIO_H) +check_include_file_concat("sys/un.h" HAVE_SYS_UN_H) +check_include_file_concat("sys/utime.h" HAVE_SYS_UTIME_H) +check_include_file_concat("sys/xattr.h" HAVE_SYS_XATTR_H) +check_include_file_concat("alloca.h" HAVE_ALLOCA_H) +check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H) +check_include_file_concat("arpa/tftp.h" HAVE_ARPA_TFTP_H) +check_include_file_concat("assert.h" HAVE_ASSERT_H) +check_include_file_concat("crypto.h" HAVE_CRYPTO_H) +check_include_file_concat("des.h" HAVE_DES_H) +check_include_file_concat("err.h" HAVE_ERR_H) +check_include_file_concat("errno.h" HAVE_ERRNO_H) +check_include_file_concat("fcntl.h" HAVE_FCNTL_H) +check_include_file_concat("idn2.h" HAVE_IDN2_H) +check_include_file_concat("ifaddrs.h" HAVE_IFADDRS_H) +check_include_file_concat("io.h" HAVE_IO_H) +check_include_file_concat("krb.h" HAVE_KRB_H) +check_include_file_concat("libgen.h" HAVE_LIBGEN_H) +check_include_file_concat("locale.h" HAVE_LOCALE_H) +check_include_file_concat("net/if.h" HAVE_NET_IF_H) +check_include_file_concat("netdb.h" HAVE_NETDB_H) +check_include_file_concat("netinet/in.h" HAVE_NETINET_IN_H) +check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H) + +check_include_file_concat("pem.h" HAVE_PEM_H) +check_include_file_concat("poll.h" HAVE_POLL_H) +check_include_file_concat("pwd.h" HAVE_PWD_H) +check_include_file_concat("rsa.h" HAVE_RSA_H) +check_include_file_concat("setjmp.h" HAVE_SETJMP_H) +check_include_file_concat("sgtty.h" HAVE_SGTTY_H) +check_include_file_concat("signal.h" HAVE_SIGNAL_H) +check_include_file_concat("ssl.h" HAVE_SSL_H) +check_include_file_concat("stdbool.h" HAVE_STDBOOL_H) +check_include_file_concat("stdint.h" HAVE_STDINT_H) +check_include_file_concat("stdio.h" HAVE_STDIO_H) +check_include_file_concat("stdlib.h" HAVE_STDLIB_H) +check_include_file_concat("string.h" HAVE_STRING_H) +check_include_file_concat("strings.h" HAVE_STRINGS_H) +check_include_file_concat("stropts.h" HAVE_STROPTS_H) +check_include_file_concat("termio.h" HAVE_TERMIO_H) +check_include_file_concat("termios.h" HAVE_TERMIOS_H) +check_include_file_concat("time.h" HAVE_TIME_H) +check_include_file_concat("unistd.h" HAVE_UNISTD_H) +check_include_file_concat("utime.h" HAVE_UTIME_H) +check_include_file_concat("x509.h" HAVE_X509_H) + +check_include_file_concat("process.h" HAVE_PROCESS_H) +check_include_file_concat("stddef.h" HAVE_STDDEF_H) +check_include_file_concat("dlfcn.h" HAVE_DLFCN_H) +check_include_file_concat("malloc.h" HAVE_MALLOC_H) +check_include_file_concat("memory.h" HAVE_MEMORY_H) +check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H) +check_include_file_concat("stdint.h" HAVE_STDINT_H) +check_include_file_concat("sockio.h" HAVE_SOCKIO_H) +check_include_file_concat("sys/utsname.h" HAVE_SYS_UTSNAME_H) + +check_type_size(size_t SIZEOF_SIZE_T) +check_type_size(ssize_t SIZEOF_SSIZE_T) +check_type_size("long long" SIZEOF_LONG_LONG) +check_type_size("long" SIZEOF_LONG) +check_type_size("short" SIZEOF_SHORT) +check_type_size("int" SIZEOF_INT) +check_type_size("__int64" SIZEOF___INT64) +check_type_size("long double" SIZEOF_LONG_DOUBLE) +check_type_size("time_t" SIZEOF_TIME_T) +if(NOT HAVE_SIZEOF_SSIZE_T) + if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T) + set(ssize_t long) + endif() + if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T) + set(ssize_t __int64) + endif() +endif() +# off_t is sized later, after the HAVE_FILE_OFFSET_BITS test + +if(HAVE_SIZEOF_LONG_LONG) + set(HAVE_LONGLONG 1) + set(HAVE_LL 1) +endif() + +find_file(RANDOM_FILE urandom /dev) +mark_as_advanced(RANDOM_FILE) + +# Check for some functions that are used +if(HAVE_LIBWS2_32) + set(CMAKE_REQUIRED_LIBRARIES ws2_32) +elseif(HAVE_LIBSOCKET) + set(CMAKE_REQUIRED_LIBRARIES socket) +endif() + +check_symbol_exists(basename "${CURL_INCLUDES}" HAVE_BASENAME) +check_symbol_exists(socket "${CURL_INCLUDES}" HAVE_SOCKET) +check_symbol_exists(select "${CURL_INCLUDES}" HAVE_SELECT) +check_symbol_exists(poll "${CURL_INCLUDES}" HAVE_POLL) +check_symbol_exists(strdup "${CURL_INCLUDES}" HAVE_STRDUP) +check_symbol_exists(strstr "${CURL_INCLUDES}" HAVE_STRSTR) +check_symbol_exists(strtok_r "${CURL_INCLUDES}" HAVE_STRTOK_R) +check_symbol_exists(strftime "${CURL_INCLUDES}" HAVE_STRFTIME) +check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME) +check_symbol_exists(strcasecmp "${CURL_INCLUDES}" HAVE_STRCASECMP) +check_symbol_exists(stricmp "${CURL_INCLUDES}" HAVE_STRICMP) +check_symbol_exists(strcmpi "${CURL_INCLUDES}" HAVE_STRCMPI) +check_symbol_exists(strncmpi "${CURL_INCLUDES}" HAVE_STRNCMPI) +check_symbol_exists(alarm "${CURL_INCLUDES}" HAVE_ALARM) +if(NOT HAVE_STRNCMPI) + set(HAVE_STRCMPI) +endif() +check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR) +check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R) +check_symbol_exists(gettimeofday "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY) +check_symbol_exists(inet_addr "${CURL_INCLUDES}" HAVE_INET_ADDR) +check_symbol_exists(inet_ntoa "${CURL_INCLUDES}" HAVE_INET_NTOA) +check_symbol_exists(inet_ntoa_r "${CURL_INCLUDES}" HAVE_INET_NTOA_R) +check_symbol_exists(tcsetattr "${CURL_INCLUDES}" HAVE_TCSETATTR) +check_symbol_exists(tcgetattr "${CURL_INCLUDES}" HAVE_TCGETATTR) +check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR) +check_symbol_exists(closesocket "${CURL_INCLUDES}" HAVE_CLOSESOCKET) +check_symbol_exists(setvbuf "${CURL_INCLUDES}" HAVE_SETVBUF) +check_symbol_exists(sigsetjmp "${CURL_INCLUDES}" HAVE_SIGSETJMP) +check_symbol_exists(getpass_r "${CURL_INCLUDES}" HAVE_GETPASS_R) +check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT) +check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID) +check_symbol_exists(getpwuid_r "${CURL_INCLUDES}" HAVE_GETPWUID_R) +check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID) +check_symbol_exists(usleep "${CURL_INCLUDES}" HAVE_USLEEP) +check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME) +check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R) +check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R) + +check_symbol_exists(gethostbyname "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME) +check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R) + +check_symbol_exists(signal "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC) +check_symbol_exists(SIGALRM "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO) +if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO) + set(HAVE_SIGNAL 1) +endif() +check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME) +check_symbol_exists(strtoll "${CURL_INCLUDES}" HAVE_STRTOLL) +check_symbol_exists(_strtoi64 "${CURL_INCLUDES}" HAVE__STRTOI64) +check_symbol_exists(strerror_r "${CURL_INCLUDES}" HAVE_STRERROR_R) +check_symbol_exists(siginterrupt "${CURL_INCLUDES}" HAVE_SIGINTERRUPT) +check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR) +check_symbol_exists(fork "${CURL_INCLUDES}" HAVE_FORK) +check_symbol_exists(getaddrinfo "${CURL_INCLUDES}" HAVE_GETADDRINFO) +check_symbol_exists(freeaddrinfo "${CURL_INCLUDES}" HAVE_FREEADDRINFO) +check_symbol_exists(freeifaddrs "${CURL_INCLUDES}" HAVE_FREEIFADDRS) +check_symbol_exists(pipe "${CURL_INCLUDES}" HAVE_PIPE) +check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE) +check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME) +check_symbol_exists(getpeername "${CURL_INCLUDES}" HAVE_GETPEERNAME) +check_symbol_exists(getsockname "${CURL_INCLUDES}" HAVE_GETSOCKNAME) +check_symbol_exists(if_nametoindex "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX) +check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT) +check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE) +check_symbol_exists(setmode "${CURL_INCLUDES}" HAVE_SETMODE) +check_symbol_exists(setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT) +check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL) +check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL) +check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT) +check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME) +check_symbol_exists(inet_pton "${CURL_INCLUDES}" HAVE_INET_PTON) + +check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR) +if(HAVE_FSETXATTR) + foreach(CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6) + curl_internal_test(${CURL_TEST}) + endforeach() +endif() + +# sigaction and sigsetjmp are special. Use special mechanism for +# detecting those, but only if previous attempt failed. +if(HAVE_SIGNAL_H) + check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION) +endif() + +if(NOT HAVE_SIGSETJMP) + if(HAVE_SETJMP_H) + check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP) + if(HAVE_MACRO_SIGSETJMP) + set(HAVE_SIGSETJMP 1) + endif() + endif() +endif() + +# If there is no stricmp(), do not allow LDAP to parse URLs +if(NOT HAVE_STRICMP) + set(HAVE_LDAP_URL_PARSE 1) +endif() + +# Do curl specific tests +foreach(CURL_TEST + HAVE_FCNTL_O_NONBLOCK + HAVE_IOCTLSOCKET + HAVE_IOCTLSOCKET_CAMEL + HAVE_IOCTLSOCKET_CAMEL_FIONBIO + HAVE_IOCTLSOCKET_FIONBIO + HAVE_IOCTL_FIONBIO + HAVE_IOCTL_SIOCGIFADDR + HAVE_SETSOCKOPT_SO_NONBLOCK + HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + TIME_WITH_SYS_TIME + HAVE_O_NONBLOCK + HAVE_GETHOSTBYADDR_R_5 + HAVE_GETHOSTBYADDR_R_7 + HAVE_GETHOSTBYADDR_R_8 + HAVE_GETHOSTBYADDR_R_5_REENTRANT + HAVE_GETHOSTBYADDR_R_7_REENTRANT + HAVE_GETHOSTBYADDR_R_8_REENTRANT + HAVE_GETHOSTBYNAME_R_3 + HAVE_GETHOSTBYNAME_R_5 + HAVE_GETHOSTBYNAME_R_6 + HAVE_GETHOSTBYNAME_R_3_REENTRANT + HAVE_GETHOSTBYNAME_R_5_REENTRANT + HAVE_GETHOSTBYNAME_R_6_REENTRANT + HAVE_IN_ADDR_T + HAVE_BOOL_T + STDC_HEADERS + RETSIGTYPE_TEST + HAVE_INET_NTOA_R_DECL + HAVE_INET_NTOA_R_DECL_REENTRANT + HAVE_GETADDRINFO + HAVE_FILE_OFFSET_BITS + HAVE_VARIADIC_MACROS_C99 + HAVE_VARIADIC_MACROS_GCC + ) + curl_internal_test(${CURL_TEST}) +endforeach() + +if(HAVE_FILE_OFFSET_BITS) + set(_FILE_OFFSET_BITS 64) + set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64") +endif() +check_type_size("off_t" SIZEOF_OFF_T) + +# include this header to get the type +set(CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include") +set(CMAKE_EXTRA_INCLUDE_FILES "curl/system.h") +check_type_size("curl_off_t" SIZEOF_CURL_OFF_T) +set(CMAKE_EXTRA_INCLUDE_FILES "") + +set(CMAKE_REQUIRED_FLAGS) + +foreach(CURL_TEST + HAVE_GLIBC_STRERROR_R + HAVE_POSIX_STRERROR_R + ) + curl_internal_test(${CURL_TEST}) +endforeach() + +# Check for reentrant +foreach(CURL_TEST + HAVE_GETHOSTBYADDR_R_5 + HAVE_GETHOSTBYADDR_R_7 + HAVE_GETHOSTBYADDR_R_8 + HAVE_GETHOSTBYNAME_R_3 + HAVE_GETHOSTBYNAME_R_5 + HAVE_GETHOSTBYNAME_R_6 + HAVE_INET_NTOA_R_DECL_REENTRANT) + if(NOT ${CURL_TEST}) + if(${CURL_TEST}_REENTRANT) + set(NEED_REENTRANT 1) + endif() + endif() +endforeach() + +if(NEED_REENTRANT) + foreach(CURL_TEST + HAVE_GETHOSTBYADDR_R_5 + HAVE_GETHOSTBYADDR_R_7 + HAVE_GETHOSTBYADDR_R_8 + HAVE_GETHOSTBYNAME_R_3 + HAVE_GETHOSTBYNAME_R_5 + HAVE_GETHOSTBYNAME_R_6) + set(${CURL_TEST} 0) + if(${CURL_TEST}_REENTRANT) + set(${CURL_TEST} 1) + endif() + endforeach() +endif() + +if(HAVE_INET_NTOA_R_DECL_REENTRANT) + set(HAVE_INET_NTOA_R_DECL 1) + set(NEED_REENTRANT 1) +endif() + +# Check clock_gettime(CLOCK_MONOTONIC, x) support +curl_internal_test(HAVE_CLOCK_GETTIME_MONOTONIC) + +# Check compiler support of __builtin_available() +curl_internal_test(HAVE_BUILTIN_AVAILABLE) + +# Some other minor tests + +if(NOT HAVE_IN_ADDR_T) + set(in_addr_t "unsigned long") +endif() + +# Fix libz / zlib.h + +if(NOT CURL_SPECIAL_LIBZ) + if(NOT HAVE_LIBZ) + set(HAVE_ZLIB_H 0) + endif() + + if(NOT HAVE_ZLIB_H) + set(HAVE_LIBZ 0) + endif() +endif() + +# Check for nonblocking +set(HAVE_DISABLED_NONBLOCKING 1) +if(HAVE_FIONBIO OR + HAVE_IOCTLSOCKET OR + HAVE_IOCTLSOCKET_CASE OR + HAVE_O_NONBLOCK) + set(HAVE_DISABLED_NONBLOCKING) +endif() + +if(RETSIGTYPE_TEST) + set(RETSIGTYPE void) +else() + set(RETSIGTYPE int) +endif() + +if(CMAKE_COMPILER_IS_GNUCC AND APPLE) + include(CheckCCompilerFlag) + check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double) + if(HAVE_C_FLAG_Wno_long_double) + # The Mac version of GCC warns about use of long double. Disable it. + get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS) + if(MPRINTF_COMPILE_FLAGS) + set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double") + else() + set(MPRINTF_COMPILE_FLAGS "-Wno-long-double") + endif() + set_source_files_properties(mprintf.c PROPERTIES + COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS}) + endif() +endif() + +# TODO test which of these headers are required +if(WIN32) + set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H}) +else() + set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H}) + set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H}) + set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H}) +endif() +set(CURL_PULL_STDINT_H ${HAVE_STDINT_H}) +set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H}) + +include(CMake/OtherTests.cmake) + +add_definitions(-DHAVE_CONFIG_H) + +# For Windows, all compilers used by CMake should support large files +if(WIN32) + set(USE_WIN32_LARGE_FILES ON) + + # Use the manifest embedded in the Windows Resource + set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -DCURL_EMBED_MANIFEST") +endif() + +if(MSVC) + # Disable default manifest added by CMake + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") + + add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) + if(CMAKE_C_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") + endif() +endif() + +if(CURL_WERROR) + if(MSVC_VERSION) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX") + else() + # this assumes clang or gcc style options + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") + endif() +endif() + +if(CURL_LTO) + if(CMAKE_VERSION VERSION_LESS 3.9) + message(FATAL_ERROR "Requested LTO but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9") + endif() + + cmake_policy(SET CMP0069 NEW) + + include(CheckIPOSupported) + check_ipo_supported(RESULT CURL_HAS_LTO OUTPUT CURL_LTO_ERROR LANGUAGES C) + if(CURL_HAS_LTO) + message(STATUS "LTO supported and enabled") + else() + message(FATAL_ERROR "LTO was requested - but compiler doesn't support it\n${CURL_LTO_ERROR}") + endif() +endif() + + +# Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it). +function(transform_makefile_inc INPUT_FILE OUTPUT_FILE) + file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT) + string(REPLACE "$(top_srcdir)" "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + + string(REGEX REPLACE "\\\\\n" "!π!α!" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REPLACE "!π!α!" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + + string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${} + string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace @@ with ${}, even if that may not be read by CMake scripts. + file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT}) + +endfunction() + +include(GNUInstallDirs) + +set(CURL_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") +set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") +set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") +set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") + +if(USE_MANUAL) + add_subdirectory(docs) +endif() + +add_subdirectory(lib) + +if(BUILD_CURL_EXE) + add_subdirectory(src) +endif() + +include(CTest) +if(BUILD_TESTING) + add_subdirectory(tests) +endif() + +# NTLM support requires crypto function adaptions from various SSL libs +# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS +if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS OR USE_WIN32_CRYPTO)) + set(use_ntlm ON) +else() + set(use_ntlm OFF) +endif() + +# Helper to populate a list (_items) with a label when conditions (the remaining +# args) are satisfied +macro(_add_if label) + # needs to be a macro to allow this indirection + if(${ARGN}) + set(_items ${_items} "${label}") + endif() +endmacro() + +# Clear list and try to detect available features +set(_items) +_add_if("SSL" SSL_ENABLED) +_add_if("IPv6" ENABLE_IPV6) +_add_if("unix-sockets" USE_UNIX_SOCKETS) +_add_if("libz" HAVE_LIBZ) +_add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32) +_add_if("IDN" HAVE_LIBIDN2) +_add_if("Largefile" (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND + ((SIZEOF_OFF_T GREATER 4) OR USE_WIN32_LARGE_FILES)) +# TODO SSP1 (WinSSL) check is missing +_add_if("SSPI" USE_WINDOWS_SSPI) +_add_if("GSS-API" HAVE_GSSAPI) +# TODO SSP1 missing for SPNEGO +_add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND + (HAVE_GSSAPI OR USE_WINDOWS_SSPI)) +_add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND + (HAVE_GSSAPI OR USE_WINDOWS_SSPI)) +# NTLM support requires crypto function adaptions from various SSL libs +# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS +_add_if("NTLM" use_ntlm) +# TODO missing option (autoconf: --enable-ntlm-wb) +_add_if("NTLM_WB" use_ntlm AND NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED) +# TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP +_add_if("TLS-SRP" USE_TLS_SRP) +# TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header +_add_if("HTTP2" USE_NGHTTP2) +_add_if("HTTPS-proxy" SSL_ENABLED AND (USE_OPENSSL OR USE_GNUTLS OR USE_NSS)) +string(REPLACE ";" " " SUPPORT_FEATURES "${_items}") +message(STATUS "Enabled features: ${SUPPORT_FEATURES}") + +# Clear list and try to detect available protocols +set(_items) +_add_if("HTTP" NOT CURL_DISABLE_HTTP) +_add_if("HTTPS" NOT CURL_DISABLE_HTTP AND SSL_ENABLED) +_add_if("FTP" NOT CURL_DISABLE_FTP) +_add_if("FTPS" NOT CURL_DISABLE_FTP AND SSL_ENABLED) +_add_if("FILE" NOT CURL_DISABLE_FILE) +_add_if("TELNET" NOT CURL_DISABLE_TELNET) +_add_if("LDAP" NOT CURL_DISABLE_LDAP) +# CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS +# TODO check HAVE_LDAP_SSL (in autoconf this is enabled with --enable-ldaps) +_add_if("LDAPS" NOT CURL_DISABLE_LDAPS AND + ((USE_OPENLDAP AND SSL_ENABLED) OR + (NOT USE_OPENLDAP AND HAVE_LDAP_SSL))) +_add_if("DICT" NOT CURL_DISABLE_DICT) +_add_if("TFTP" NOT CURL_DISABLE_TFTP) +_add_if("GOPHER" NOT CURL_DISABLE_GOPHER) +_add_if("POP3" NOT CURL_DISABLE_POP3) +_add_if("POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED) +_add_if("IMAP" NOT CURL_DISABLE_IMAP) +_add_if("IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED) +_add_if("SMB" NOT CURL_DISABLE_SMB AND use_ntlm) +_add_if("SMBS" NOT CURL_DISABLE_SMB AND SSL_ENABLED AND use_ntlm) +_add_if("SMTP" NOT CURL_DISABLE_SMTP) +_add_if("SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED) +_add_if("SCP" USE_LIBSSH2) +_add_if("SFTP" USE_LIBSSH2) +_add_if("RTSP" NOT CURL_DISABLE_RTSP) +_add_if("RTMP" USE_LIBRTMP) +if(_items) + list(SORT _items) +endif() +string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}") +message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}") + +# Clear list and collect SSL backends +set(_items) +_add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI) +_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL) +_add_if("Secure Transport" SSL_ENABLED AND USE_SECTRANSP) +_add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS) +_add_if("BearSSL" SSL_ENABLED AND USE_BEARSSL) +_add_if("NSS" SSL_ENABLED AND USE_NSS) +if(_items) + list(SORT _items) +endif() +string(REPLACE ";" " " SSL_BACKENDS "${_items}") +message(STATUS "Enabled SSL backends: ${SSL_BACKENDS}") + +# curl-config needs the following options to be set. +set(CC "${CMAKE_C_COMPILER}") +# TODO probably put a -D... options here? +set(CONFIGURE_OPTIONS "") +# TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB? +set(CPPFLAG_CURL_STATICLIB "") +set(CURLVERSION "${CURL_VERSION}") +if(BUILD_SHARED_LIBS) + set(ENABLE_SHARED "yes") + set(ENABLE_STATIC "no") +else() + set(ENABLE_SHARED "no") + set(ENABLE_STATIC "yes") +endif() +set(exec_prefix "\${prefix}") +set(includedir "\${prefix}/include") +set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}") +set(LIBCURL_LIBS "") +set(libdir "${CMAKE_INSTALL_PREFIX}/lib") +foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS}) + if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-") + set(LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}") + else() + set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}") + endif() +endforeach() +# "a" (Linux) or "lib" (Windows) +string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}") +set(prefix "${CMAKE_INSTALL_PREFIX}") +# Set this to "yes" to append all libraries on which -lcurl is dependent +set(REQUIRE_LIB_DEPS "no") +# SUPPORT_FEATURES +# SUPPORT_PROTOCOLS +set(VERSIONNUM "${CURL_VERSION_NUM}") + +# Finally generate a "curl-config" matching this config +# Use: +# * ENABLE_SHARED +# * ENABLE_STATIC +configure_file("${CURL_SOURCE_DIR}/curl-config.in" + "${CURL_BINARY_DIR}/curl-config" @ONLY) +install(FILES "${CURL_BINARY_DIR}/curl-config" + DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + +# Finally generate a pkg-config file matching this config +configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in" + "${CURL_BINARY_DIR}/libcurl.pc" @ONLY) +install(FILES "${CURL_BINARY_DIR}/libcurl.pc" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + +# install headers +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING PATTERN "*.h") + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${version_config}" + VERSION ${CURL_VERSION} + COMPATIBILITY SameMajorVersion +) + +# Use: +# * TARGETS_EXPORT_NAME +# * PROJECT_NAME +configure_package_config_file(CMake/curl-config.cmake.in + "${project_config}" + INSTALL_DESTINATION ${CURL_INSTALL_CMAKE_DIR} +) + +install( + EXPORT "${TARGETS_EXPORT_NAME}" + NAMESPACE "${PROJECT_NAME}::" + DESTINATION ${CURL_INSTALL_CMAKE_DIR} +) + +install( + FILES ${version_config} ${project_config} + DESTINATION ${CURL_INSTALL_CMAKE_DIR} +) + +# Workaround for MSVS10 to avoid the Dialog Hell +# FIXME: This could be removed with future version of CMake. +if(MSVC_VERSION EQUAL 1600) + set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln") + if(EXISTS "${CURL_SLN_FILENAME}") + file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n") + endif() +endif() + +if(NOT TARGET uninstall) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake + IMMEDIATE @ONLY) + + add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P + ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake) +endif() diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..9d9e4af8d8 --- /dev/null +++ b/COPYING @@ -0,0 +1,22 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2020, Daniel Stenberg, , and many +contributors, see the THANKS file. + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. diff --git a/GIT-INFO b/GIT-INFO new file mode 100644 index 0000000000..51df76ab4f --- /dev/null +++ b/GIT-INFO @@ -0,0 +1,44 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +GIT-INFO + +This file is only present in git - never in release archives. It contains +information about other files and things that the git repository keeps in its +inner sanctum. + +To build in environments that support configure, after having extracted +everything from git, do this: + +./buildconf +./configure +make + + Daniel uses a ./configure line similar to this for easier development: + + ./configure --disable-shared --enable-debug --enable-maintainer-mode + +In environments that don't support configure (i.e. Microsoft), do this: + +buildconf.bat + + +REQUIREMENTS + + For buildconf (not buildconf.bat) to work, you need the following software +installed: + + o autoconf 2.57 (or later) + o automake 1.7 (or later) + o libtool 1.4.2 (or later) + o GNU m4 (required by autoconf) + + o nroff + perl + + If you don't have nroff and perl and you for some reason don't want to + install them, you can rename the source file src/tool_hugehelp.c.cvs to + src/tool_hugehelp.c and avoid having to generate this file. This will + give you a stubbed version of the file that doesn't contain actual content. diff --git a/MacOSX-Framework b/MacOSX-Framework new file mode 100755 index 0000000000..e6badcde54 --- /dev/null +++ b/MacOSX-Framework @@ -0,0 +1,137 @@ +#!/bin/bash +# This script performs all of the steps needed to build a +# universal binary libcurl.framework for Mac OS X 10.4 or greater. +# +# Hendrik Visage: +# Generalizations added since Snowleopard (10.6) do not include +# the 10.4u SDK. +# +# Also note: +# 10.5 is the *ONLY* SDK that support PPC64 :( -- 10.6 do not have ppc64 support +#If you need to have PPC64 support then change below to 1 +PPC64_NEEDED=0 +# Apple does not support building for PPC anymore in Xcode 4 and later. +# If you're using Xcode 3 or earlier and need PPC support, then change +# the setting below to 1 +PPC_NEEDED=0 + +# For me the default is to develop for the platform I am on, and if you +#desire compatibility with older versions then change USE_OLD to 1 :) +USE_OLD=0 + +VERSION=`/usr/bin/sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' include/curl/curlver.h` +FRAMEWORK_VERSION=Versions/Release-$VERSION + +#I also wanted to "copy over" the system, and thus the reason I added the +# version to Versions/Release-7.20.1 etc. +# now a simple rsync -vaP libcurl.framework /Library/Frameworks will install it +# and setup the right paths to this version, leaving the system version +# "intact", so you can "fix" it later with the links to Versions/A/... + +DEVELOPER_PATH=`xcode-select --print-path` +# Around Xcode 4.3, SDKs were moved from the Developer folder into the +# MacOSX.platform folder +if test -d "$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs"; then + SDK_PATH="$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs" +else + SDK_PATH="$DEVELOPER_PATH/SDKs"; +fi +OLD_SDK=`ls $SDK_PATH|head -1` +NEW_SDK=`ls -r $SDK_PATH|head -1` + +if test "0"$USE_OLD -gt 0 +then + SDK32=$OLD_SDK +else + SDK32=$NEW_SDK +fi + +MACVER=`echo $SDK32|sed -e s/[a-zA-Z]//g -e s/.\$//` + +SDK32_DIR=$SDK_PATH/$SDK32 +MINVER32='-mmacosx-version-min='$MACVER +if test $PPC_NEEDED -gt 0; then + ARCHES32='-arch i386 -arch ppc' +else + ARCHES32='-arch i386' +fi + +if test $PPC64_NEEDED -gt 0 +then + SDK64=10.5 + ARCHES64='-arch x86_64 -arch ppc64' + SDK64=`ls $SDK_PATH|grep 10.5|head -1` +else + ARCHES64='-arch x86_64' + #We "know" that 10.4 and earlier do not support 64bit + OLD_SDK64=`ls $SDK_PATH|egrep -v "10.[0-4]"|head -1` + NEW_SDK64=`ls -r $SDK_PATH|egrep -v "10.[0-4][^0-9]" | head -1` + if test $USE_OLD -gt 0 + then + SDK64=$OLD_SDK64 + else + SDK64=$NEW_SDK64 + fi +fi + +SDK64_DIR=$SDK_PATH/$SDK64 +MACVER64=`echo $SDK64|sed -e s/[a-zA-Z]//g -e s/.\$//` + +MINVER64='-mmacosx-version-min='$MACVER64 + +if test ! -z $SDK32; then + echo "----Configuring libcurl for 32 bit universal framework..." + make clean + ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \ + CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32" \ + LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 -Wl,-headerpad_max_install_names" \ + CC=$CC + + echo "----Building 32 bit libcurl..." + make -j `sysctl -n hw.logicalcpu_max` + + echo "----Creating 32 bit framework..." + rm -r libcurl.framework + mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources + cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl + install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl + /usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist + mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl + cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl + pushd libcurl.framework + ln -fs ${FRAMEWORK_VERSION}/libcurl libcurl + ln -fs ${FRAMEWORK_VERSION}/Resources Resources + ln -fs ${FRAMEWORK_VERSION}/Headers Headers + cd Versions + ln -fs $(basename "${FRAMEWORK_VERSION}") Current + + echo Testing for SDK64 + if test -d $SDK64_DIR; then + echo entering... + popd + make clean + echo "----Configuring libcurl for 64 bit universal framework..." + ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \ + CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64" \ + LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 -Wl,-headerpad_max_install_names" \ + CC=$CC + + echo "----Building 64 bit libcurl..." + make -j `sysctl -n hw.logicalcpu_max` + + echo "----Appending 64 bit framework to 32 bit framework..." + cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 + install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 + cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 + pwd + lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl + rm libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 + fi + + pwd + lipo -info libcurl.framework/${FRAMEWORK_VERSION}/libcurl + echo "libcurl.framework is built and can now be included in other projects." + echo "Copy libcurl.framework to your bundle's Contents/Frameworks folder, ~/Library/Frameworks or /Library/Frameworks." +else + echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4/5/6 SDK installed." +fi diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000000..1e9ecd8c47 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,728 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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 + +ACLOCAL_AMFLAGS = -I m4 + +CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \ + CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \ + CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \ + CMake/Macros.cmake \ + CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake \ + CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake \ + CMake/FindMbedTLS.cmake CMake/FindBearSSL.cmake \ + CMake/cmake_uninstall.cmake.in CMake/curl-config.cmake.in + +VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl +VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist +VC6_LIBDSP_DEPS = $(VC6_LIBTMPL) Makefile.am lib/Makefile.inc +VC6_SRCTMPL = projects/Windows/VC6/src/curl.tmpl +VC6_SRCDSP = projects/Windows/VC6/src/curl.dsp.dist +VC6_SRCDSP_DEPS = $(VC6_SRCTMPL) Makefile.am src/Makefile.inc + +VC7_LIBTMPL = projects/Windows/VC7/lib/libcurl.tmpl +VC7_LIBVCPROJ = projects/Windows/VC7/lib/libcurl.vcproj.dist +VC7_LIBVCPROJ_DEPS = $(VC7_LIBTMPL) Makefile.am lib/Makefile.inc +VC7_SRCTMPL = projects/Windows/VC7/src/curl.tmpl +VC7_SRCVCPROJ = projects/Windows/VC7/src/curl.vcproj.dist +VC7_SRCVCPROJ_DEPS = $(VC7_SRCTMPL) Makefile.am src/Makefile.inc + +VC71_LIBTMPL = projects/Windows/VC7.1/lib/libcurl.tmpl +VC71_LIBVCPROJ = projects/Windows/VC7.1/lib/libcurl.vcproj.dist +VC71_LIBVCPROJ_DEPS = $(VC71_LIBTMPL) Makefile.am lib/Makefile.inc +VC71_SRCTMPL = projects/Windows/VC7.1/src/curl.tmpl +VC71_SRCVCPROJ = projects/Windows/VC7.1/src/curl.vcproj.dist +VC71_SRCVCPROJ_DEPS = $(VC71_SRCTMPL) Makefile.am src/Makefile.inc + +VC8_LIBTMPL = projects/Windows/VC8/lib/libcurl.tmpl +VC8_LIBVCPROJ = projects/Windows/VC8/lib/libcurl.vcproj.dist +VC8_LIBVCPROJ_DEPS = $(VC8_LIBTMPL) Makefile.am lib/Makefile.inc +VC8_SRCTMPL = projects/Windows/VC8/src/curl.tmpl +VC8_SRCVCPROJ = projects/Windows/VC8/src/curl.vcproj.dist +VC8_SRCVCPROJ_DEPS = $(VC8_SRCTMPL) Makefile.am src/Makefile.inc + +VC9_LIBTMPL = projects/Windows/VC9/lib/libcurl.tmpl +VC9_LIBVCPROJ = projects/Windows/VC9/lib/libcurl.vcproj.dist +VC9_LIBVCPROJ_DEPS = $(VC9_LIBTMPL) Makefile.am lib/Makefile.inc +VC9_SRCTMPL = projects/Windows/VC9/src/curl.tmpl +VC9_SRCVCPROJ = projects/Windows/VC9/src/curl.vcproj.dist +VC9_SRCVCPROJ_DEPS = $(VC9_SRCTMPL) Makefile.am src/Makefile.inc + +VC10_LIBTMPL = projects/Windows/VC10/lib/libcurl.tmpl +VC10_LIBVCXPROJ = projects/Windows/VC10/lib/libcurl.vcxproj.dist +VC10_LIBVCXPROJ_DEPS = $(VC10_LIBTMPL) Makefile.am lib/Makefile.inc +VC10_SRCTMPL = projects/Windows/VC10/src/curl.tmpl +VC10_SRCVCXPROJ = projects/Windows/VC10/src/curl.vcxproj.dist +VC10_SRCVCXPROJ_DEPS = $(VC10_SRCTMPL) Makefile.am src/Makefile.inc + +VC11_LIBTMPL = projects/Windows/VC11/lib/libcurl.tmpl +VC11_LIBVCXPROJ = projects/Windows/VC11/lib/libcurl.vcxproj.dist +VC11_LIBVCXPROJ_DEPS = $(VC11_LIBTMPL) Makefile.am lib/Makefile.inc +VC11_SRCTMPL = projects/Windows/VC11/src/curl.tmpl +VC11_SRCVCXPROJ = projects/Windows/VC11/src/curl.vcxproj.dist +VC11_SRCVCXPROJ_DEPS = $(VC11_SRCTMPL) Makefile.am src/Makefile.inc + +VC12_LIBTMPL = projects/Windows/VC12/lib/libcurl.tmpl +VC12_LIBVCXPROJ = projects/Windows/VC12/lib/libcurl.vcxproj.dist +VC12_LIBVCXPROJ_DEPS = $(VC12_LIBTMPL) Makefile.am lib/Makefile.inc +VC12_SRCTMPL = projects/Windows/VC12/src/curl.tmpl +VC12_SRCVCXPROJ = projects/Windows/VC12/src/curl.vcxproj.dist +VC12_SRCVCXPROJ_DEPS = $(VC12_SRCTMPL) Makefile.am src/Makefile.inc + +VC14_LIBTMPL = projects/Windows/VC14/lib/libcurl.tmpl +VC14_LIBVCXPROJ = projects/Windows/VC14/lib/libcurl.vcxproj.dist +VC14_LIBVCXPROJ_DEPS = $(VC14_LIBTMPL) Makefile.am lib/Makefile.inc +VC14_SRCTMPL = projects/Windows/VC14/src/curl.tmpl +VC14_SRCVCXPROJ = projects/Windows/VC14/src/curl.vcxproj.dist +VC14_SRCVCXPROJ_DEPS = $(VC14_SRCTMPL) Makefile.am src/Makefile.inc + +VC15_LIBTMPL = projects/Windows/VC15/lib/libcurl.tmpl +VC15_LIBVCXPROJ = projects/Windows/VC15/lib/libcurl.vcxproj.dist +VC15_LIBVCXPROJ_DEPS = $(VC15_LIBTMPL) Makefile.am lib/Makefile.inc +VC15_SRCTMPL = projects/Windows/VC15/src/curl.tmpl +VC15_SRCVCXPROJ = projects/Windows/VC15/src/curl.vcxproj.dist +VC15_SRCVCXPROJ_DEPS = $(VC15_SRCTMPL) Makefile.am src/Makefile.inc + +VC_DIST = projects/README \ + projects/build-openssl.bat \ + projects/build-wolfssl.bat \ + projects/checksrc.bat \ + projects/Windows/VC6/curl-all.dsw \ + projects/Windows/VC6/lib/libcurl.dsw \ + projects/Windows/VC6/src/curl.dsw \ + projects/Windows/VC7/curl-all.sln \ + projects/Windows/VC7/lib/libcurl.sln \ + projects/Windows/VC7/src/curl.sln \ + projects/Windows/VC7.1/curl-all.sln \ + projects/Windows/VC7.1/lib/libcurl.sln \ + projects/Windows/VC7.1/src/curl.sln \ + projects/Windows/VC8/curl-all.sln \ + projects/Windows/VC8/lib/libcurl.sln \ + projects/Windows/VC8/src/curl.sln \ + projects/Windows/VC9/curl-all.sln \ + projects/Windows/VC9/lib/libcurl.sln \ + projects/Windows/VC9/src/curl.sln \ + projects/Windows/VC10/curl-all.sln \ + projects/Windows/VC10/lib/libcurl.sln \ + projects/Windows/VC10/lib/libcurl.vcxproj.filters \ + projects/Windows/VC10/src/curl.sln \ + projects/Windows/VC10/src/curl.vcxproj.filters \ + projects/Windows/VC11/curl-all.sln \ + projects/Windows/VC11/lib/libcurl.sln \ + projects/Windows/VC11/lib/libcurl.vcxproj.filters \ + projects/Windows/VC11/src/curl.sln \ + projects/Windows/VC11/src/curl.vcxproj.filters \ + projects/Windows/VC12/curl-all.sln \ + projects/Windows/VC12/lib/libcurl.sln \ + projects/Windows/VC12/lib/libcurl.vcxproj.filters \ + projects/Windows/VC12/src/curl.sln \ + projects/Windows/VC12/src/curl.vcxproj.filters \ + projects/Windows/VC14/curl-all.sln \ + projects/Windows/VC14/lib/libcurl.sln \ + projects/Windows/VC14/lib/libcurl.vcxproj.filters \ + projects/Windows/VC14/src/curl.sln \ + projects/Windows/VC14/src/curl.vcxproj.filters \ + projects/Windows/VC15/curl-all.sln \ + projects/Windows/VC15/lib/libcurl.sln \ + projects/Windows/VC15/lib/libcurl.vcxproj.filters \ + projects/Windows/VC15/src/curl.sln \ + projects/Windows/VC15/src/curl.vcxproj.filters \ + projects/generate.bat \ + projects/wolfssl_options.h \ + projects/wolfssl_override.props + +WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \ + winbuild/MakefileBuild.vc winbuild/Makefile.vc + +PLAN9_DIST = plan9/include/mkfile \ + plan9/include/mkfile \ + plan9/mkfile.proto \ + plan9/mkfile \ + plan9/BUILD.PLAN9.txt \ + plan9/lib/mkfile.inc \ + plan9/lib/mkfile \ + plan9/src/mkfile.inc \ + plan9/src/mkfile + +EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ + RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \ + scripts/updatemanpages.pl $(CMAKE_DIST) \ + $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \ + lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl + +CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \ + $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \ + $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \ + $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \ + $(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ) $(VC15_LIBVCXPROJ) $(VC15_SRCVCXPROJ) + +bin_SCRIPTS = curl-config + +SUBDIRS = lib src +DIST_SUBDIRS = $(SUBDIRS) tests packages scripts include docs + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libcurl.pc + +# List of files required to generate VC IDE .dsp, .vcproj and .vcxproj files +include lib/Makefile.inc +include src/Makefile.inc + +dist-hook: + rm -rf $(top_builddir)/tests/log + find $(distdir) -name "*.dist" -exec rm {} \; + (distit=`find $(srcdir) -name "*.dist" | grep -v ./ares/`; \ + for file in $$distit; do \ + strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \ + cp -p $$file $(distdir)$$strip; \ + done) + +html: + cd docs && $(MAKE) html + +pdf: + cd docs && $(MAKE) pdf + +check: test examples check-docs + +if CROSSCOMPILING +test-full: test +test-torture: test + +test: + @echo "NOTICE: we can't run the tests when cross-compiling!" + +else + +test: + @(cd tests; $(MAKE) all quiet-test) + +test-full: + @(cd tests; $(MAKE) all full-test) + +test-nonflaky: + @(cd tests; $(MAKE) all nonflaky-test) + +test-torture: + @(cd tests; $(MAKE) all torture-test) + +test-event: + @(cd tests; $(MAKE) all event-test) + +test-am: + @(cd tests; $(MAKE) all am-test) + +endif + +examples: + @(cd docs/examples; $(MAKE) check) + +check-docs: + @(cd docs/libcurl; $(MAKE) check) + +# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros +# must contain the following line: +# %_topdir /home/loic/local/rpm +# and that /home/loic/local/rpm contains the directory SOURCES, BUILD etc. +# +# cd /home/loic/local/rpm ; mkdir -p SOURCES BUILD RPMS/i386 SPECS SRPMS +# +# If additional configure flags are needed to build the package, add the +# following in ~/.rpmmacros +# %configure CFLAGS="%{optflags}" ./configure %{_target_platform} --prefix=%{_prefix} ${AM_CONFIGFLAGS} +# and run make rpm in the following way: +# AM_CONFIGFLAGS='--with-uri=/home/users/loic/local/RedHat-6.2' make rpm +# + +rpms: + $(MAKE) RPMDIST=curl rpm + $(MAKE) RPMDIST=curl-ssl rpm + +rpm: + RPM_TOPDIR=`rpm --showrc | $(PERL) -n -e 'print if(s/.*_topdir\s+(.*)/$$1/)'` ; \ + cp $(srcdir)/packages/Linux/RPM/$(RPMDIST).spec $$RPM_TOPDIR/SPECS ; \ + cp $(PACKAGE)-$(VERSION).tar.gz $$RPM_TOPDIR/SOURCES ; \ + rpm -ba --clean --rmsource $$RPM_TOPDIR/SPECS/$(RPMDIST).spec ; \ + mv $$RPM_TOPDIR/RPMS/i386/$(RPMDIST)-*.rpm . ; \ + mv $$RPM_TOPDIR/SRPMS/$(RPMDIST)-*.src.rpm . + +# +# Build a Solaris pkgadd format file +# run 'make pkgadd' once you've done './configure' and 'make' to make a Solaris pkgadd format +# file (which ends up back in this directory). +# The pkgadd file is in 'pkgtrans' format, so to install on Solaris, do +# pkgadd -d ./HAXXcurl-* +# + +# gak - libtool requires an absolute directory, hence the pwd below... +pkgadd: + umask 022 ; \ + $(MAKE) install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \ + cat COPYING > $(srcdir)/packages/Solaris/copyright ; \ + cd $(srcdir)/packages/Solaris && $(MAKE) package + +# +# Build a cygwin binary tarball installation file +# resulting .tar.bz2 file will end up at packages/Win32/cygwin +cygwinbin: + $(MAKE) -C packages/Win32/cygwin cygwinbin + +# We extend the standard install with a custom hook: +install-data-hook: + cd include && $(MAKE) install + cd docs && $(MAKE) install + cd docs/libcurl && $(MAKE) install + +# We extend the standard uninstall with a custom hook: +uninstall-hook: + cd include && $(MAKE) uninstall + cd docs && $(MAKE) uninstall + cd docs/libcurl && $(MAKE) uninstall + +ca-bundle: lib/mk-ca-bundle.pl + @echo "generating a fresh ca-bundle.crt" + @perl $< -b -l -u lib/ca-bundle.crt + +ca-firefox: lib/firefox-db2pem.sh + @echo "generating a fresh ca-bundle.crt" + ./lib/firefox-db2pem.sh lib/ca-bundle.crt + +checksrc: + cd lib && $(MAKE) checksrc + cd src && $(MAKE) checksrc + cd tests && $(MAKE) checksrc + cd include/curl && $(MAKE) checksrc + cd docs/examples && $(MAKE) checksrc + +.PHONY: vc-ide + +vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \ + $(VC7_SRCVCPROJ_DEPS) $(VC71_LIBVCPROJ_DEPS) $(VC71_SRCVCPROJ_DEPS) \ + $(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS) \ + $(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS) \ + $(VC11_LIBVCXPROJ_DEPS) $(VC11_SRCVCXPROJ_DEPS) $(VC12_LIBVCXPROJ_DEPS) \ + $(VC12_SRCVCXPROJ_DEPS) $(VC14_LIBVCXPROJ_DEPS) $(VC14_SRCVCXPROJ_DEPS) \ + $(VC15_LIBVCXPROJ_DEPS) $(VC15_SRCVCXPROJ_DEPS) + @(win32_lib_srcs='$(LIB_CFILES)'; \ + win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \ + win32_lib_rc='$(LIB_RCFILES)'; \ + win32_lib_vauth_srcs='$(LIB_VAUTH_CFILES)'; \ + win32_lib_vauth_hdrs='$(LIB_VAUTH_HFILES)'; \ + win32_lib_vquic_srcs='$(LIB_VQUIC_CFILES)'; \ + win32_lib_vquic_hdrs='$(LIB_VQUIC_HFILES)'; \ + win32_lib_vssh_srcs='$(LIB_VSSH_CFILES)'; \ + win32_lib_vssh_hdrs='$(LIB_VSSH_HFILES)'; \ + win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \ + win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \ + win32_src_srcs='$(CURL_CFILES)'; \ + win32_src_hdrs='$(CURL_HFILES)'; \ + win32_src_rc='$(CURL_RCFILES)'; \ + win32_src_x_srcs='$(CURLX_CFILES)'; \ + win32_src_x_hdrs='$(CURLX_HFILES) ../lib/config-win32.h'; \ + \ + sorted_lib_srcs=`for file in $$win32_lib_srcs; do echo $$file; done | sort`; \ + sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \ + sorted_lib_vauth_srcs=`for file in $$win32_lib_vauth_srcs; do echo $$file; done | sort`; \ + sorted_lib_vauth_hdrs=`for file in $$win32_lib_vauth_hdrs; do echo $$file; done | sort`; \ + sorted_lib_vquic_srcs=`for file in $$win32_lib_vquic_srcs; do echo $$file; done | sort`; \ + sorted_lib_vquic_hdrs=`for file in $$win32_lib_vquic_hdrs; do echo $$file; done | sort`; \ + sorted_lib_vssh_srcs=`for file in $$win32_lib_vssh_srcs; do echo $$file; done | sort`; \ + sorted_lib_vssh_hdrs=`for file in $$win32_lib_vssh_hdrs; do echo $$file; done | sort`; \ + sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo $$file; done | sort`; \ + sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo $$file; done | sort`; \ + sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done | sort`; \ + sorted_src_hdrs=`for file in $$win32_src_hdrs; do echo $$file; done | sort`; \ + sorted_src_x_srcs=`for file in $$win32_src_x_srcs; do echo $$file; done | sort`; \ + sorted_src_x_hdrs=`for file in $$win32_src_x_hdrs; do echo $$file; done | sort`; \ + \ + awk_code='\ +function gen_element(type, dir, file)\ +{\ + sub(/vauth\//, "", file);\ + sub(/vquic\//, "", file);\ + sub(/vssh\//, "", file);\ + sub(/vtls\//, "", file);\ +\ + spaces=" ";\ + if(dir == "lib\\vauth" ||\ + dir == "lib\\vquic" ||\ + dir == "lib\\vssh" ||\ + dir == "lib\\vtls")\ + tabs=" ";\ + else\ + tabs=" ";\ +\ + if(type == "dsp") {\ + printf("# Begin Source File\r\n");\ + printf("\r\n");\ + printf("SOURCE=..\\..\\..\\..\\%s\\%s\r\n", dir, file);\ + printf("# End Source File\r\n");\ + }\ + else if(type == "vcproj1") {\ + printf("%s\r\n",\ + tabs, dir, file);\ + printf("%s\r\n", tabs);\ + }\ + else if(type == "vcproj2") {\ + printf("%s\r\n", tabs);\ + printf("%s\r\n", tabs);\ + }\ + else if(type == "vcxproj") {\ + i = index(file, ".");\ + ext = substr(file, i == 0 ? 0 : i + 1);\ +\ + if(ext == "c")\ + printf("%s\r\n",\ + spaces, dir, file);\ + else if(ext == "h")\ + printf("%s\r\n",\ + spaces, dir, file);\ + else if(ext == "rc")\ + printf("%s\r\n",\ + spaces, dir, file);\ + }\ +}\ +\ +{\ +\ + if($$0 == "CURL_LIB_C_FILES") {\ + split(lib_srcs, arr);\ + for(val in arr) gen_element(proj_type, "lib", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_H_FILES") {\ + split(lib_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "lib", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_RC_FILES") {\ + split(lib_rc, arr);\ + for(val in arr) gen_element(proj_type, "lib", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VAUTH_C_FILES") {\ + split(lib_vauth_srcs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VAUTH_H_FILES") {\ + split(lib_vauth_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VQUIC_C_FILES") {\ + split(lib_vquic_srcs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VQUIC_H_FILES") {\ + split(lib_vquic_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VSSH_C_FILES") {\ + split(lib_vssh_srcs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VSSH_H_FILES") {\ + split(lib_vssh_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VTLS_C_FILES") {\ + split(lib_vtls_srcs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\ + }\ + else if($$0 == "CURL_LIB_VTLS_H_FILES") {\ + split(lib_vtls_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\ + }\ + else if($$0 == "CURL_SRC_C_FILES") {\ + split(src_srcs, arr);\ + for(val in arr) gen_element(proj_type, "src", arr[val]);\ + }\ + else if($$0 == "CURL_SRC_H_FILES") {\ + split(src_hdrs, arr);\ + for(val in arr) gen_element(proj_type, "src", arr[val]);\ + }\ + else if($$0 == "CURL_SRC_RC_FILES") {\ + split(src_rc, arr);\ + for(val in arr) gen_element(proj_type, "src", arr[val]);\ + }\ + else if($$0 == "CURL_SRC_X_C_FILES") {\ + split(src_x_srcs, arr);\ + for(val in arr) {\ + sub(/..\/lib\//, "", arr[val]);\ + gen_element(proj_type, "lib", arr[val]);\ + }\ + }\ + else if($$0 == "CURL_SRC_X_H_FILES") {\ + split(src_x_hdrs, arr);\ + for(val in arr) {\ + sub(/..\/lib\//, "", arr[val]);\ + gen_element(proj_type, "lib", arr[val]);\ + }\ + }\ + else\ + printf("%s\r\n", $$0);\ +}';\ + \ + echo "generating '$(VC6_LIBDSP)'"; \ + awk -v proj_type=dsp \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \ + \ + echo "generating '$(VC6_SRCDSP)'"; \ + awk -v proj_type=dsp \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC6_SRCTMPL) > $(VC6_SRCDSP) || { exit 1; }; \ + \ + echo "generating '$(VC7_LIBVCPROJ)'"; \ + awk -v proj_type=vcproj1 \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC7_SRCVCPROJ)'"; \ + awk -v proj_type=vcproj1 \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC7_SRCTMPL) > $(VC7_SRCVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC71_LIBVCPROJ)'"; \ + awk -v proj_type=vcproj1 \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC71_SRCVCPROJ)'"; \ + awk -v proj_type=vcproj1 \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC71_SRCTMPL) > $(VC71_SRCVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC8_LIBVCPROJ)'"; \ + awk -v proj_type=vcproj2 \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC8_SRCVCPROJ)'"; \ + awk -v proj_type=vcproj2 \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC8_SRCTMPL) > $(VC8_SRCVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC9_LIBVCPROJ)'"; \ + awk -v proj_type=vcproj2 \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC9_SRCVCPROJ)'"; \ + awk -v proj_type=vcproj2 \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC9_SRCTMPL) > $(VC9_SRCVCPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC10_LIBVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC10_SRCVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC10_SRCTMPL) > $(VC10_SRCVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC11_LIBVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC11_SRCVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC11_SRCTMPL) > $(VC11_SRCVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC12_LIBVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC12_SRCVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC12_SRCTMPL) > $(VC12_SRCVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC14_LIBVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC14_SRCVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC14_SRCTMPL) > $(VC14_SRCVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC15_LIBVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v lib_srcs="$$sorted_lib_srcs" \ + -v lib_hdrs="$$sorted_lib_hdrs" \ + -v lib_rc="$$win32_lib_rc" \ + -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \ + -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \ + -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \ + -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \ + -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \ + -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \ + -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \ + -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \ + "$$awk_code" $(srcdir)/$(VC15_LIBTMPL) > $(VC15_LIBVCXPROJ) || { exit 1; }; \ + \ + echo "generating '$(VC15_SRCVCXPROJ)'"; \ + awk -v proj_type=vcxproj \ + -v src_srcs="$$sorted_src_srcs" \ + -v src_hdrs="$$sorted_src_hdrs" \ + -v src_rc="$$win32_src_rc" \ + -v src_x_srcs="$$sorted_src_x_srcs" \ + -v src_x_hdrs="$$sorted_src_x_hdrs" \ + "$$awk_code" $(srcdir)/$(VC15_SRCTMPL) > $(VC15_SRCVCXPROJ) || { exit 1; };) + +tidy: + (cd src && $(MAKE) tidy) + (cd lib && $(MAKE) tidy) diff --git a/Makefile.dist b/Makefile.dist new file mode 100644 index 0000000000..a6316ab5fe --- /dev/null +++ b/Makefile.dist @@ -0,0 +1,127 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +########################################################################### + +all: + ./configure + make + +ssl: + ./configure --with-ssl + make + +watcom: .SYMBOLIC + cd lib && $(MAKE) -u -f Makefile.Watcom + cd src && $(MAKE) -u -f Makefile.Watcom + +watcom-clean: .SYMBOLIC + cd lib && $(MAKE) -u -f Makefile.Watcom clean + cd src && $(MAKE) -u -f Makefile.Watcom clean + +watcom-vclean: .SYMBOLIC + cd lib && $(MAKE) -u -f Makefile.Watcom vclean + cd src && $(MAKE) -u -f Makefile.Watcom vclean + +mingw32: + $(MAKE) -C lib -f Makefile.m32 + $(MAKE) -C src -f Makefile.m32 + +mingw32-clean: + $(MAKE) -C lib -f Makefile.m32 clean + $(MAKE) -C src -f Makefile.m32 clean + $(MAKE) -C docs/examples -f Makefile.m32 clean + +mingw32-vclean mingw32-distclean: + $(MAKE) -C lib -f Makefile.m32 vclean + $(MAKE) -C src -f Makefile.m32 vclean + $(MAKE) -C docs/examples -f Makefile.m32 vclean + +mingw32-examples%: + $(MAKE) -C docs/examples -f Makefile.m32 CFG=$@ + +mingw32%: + $(MAKE) -C lib -f Makefile.m32 CFG=$@ + $(MAKE) -C src -f Makefile.m32 CFG=$@ + +vc: + cd winbuild + nmake /f Makefile.vc MACHINE=x86 + +vc-x64: + cd winbuild + nmake /f Makefile.vc MACHINE=x64 + +djgpp: + $(MAKE) -C lib -f Makefile.dj + $(MAKE) -C src -f Makefile.dj + +cygwin: + ./configure + make + +cygwin-ssl: + ./configure --with-ssl + make + +amiga: + cd ./lib && make -f makefile.amiga + cd ./src && make -f makefile.amiga + +netware: + $(MAKE) -C lib -f Makefile.netware + $(MAKE) -C src -f Makefile.netware + +netware-clean: + $(MAKE) -C lib -f Makefile.netware clean + $(MAKE) -C src -f Makefile.netware clean + $(MAKE) -C docs/examples -f Makefile.netware clean + +netware-vclean netware-distclean: + $(MAKE) -C lib -f Makefile.netware vclean + $(MAKE) -C src -f Makefile.netware vclean + $(MAKE) -C docs/examples -f Makefile.netware vclean + +netware-install: + $(MAKE) -C lib -f Makefile.netware install + $(MAKE) -C src -f Makefile.netware install + +netware-examples-%: + $(MAKE) -C docs/examples -f Makefile.netware CFG=$@ + +netware-%: + $(MAKE) -C lib -f Makefile.netware CFG=$@ + $(MAKE) -C src -f Makefile.netware CFG=$@ + +unix: all + +unix-ssl: ssl + +linux: all + +linux-ssl: ssl + +ca-bundle: lib/mk-ca-bundle.pl + @echo "generate a fresh ca-bundle.crt" + @perl $< -b -l -u lib/ca-bundle.crt + +ca-firefox: lib/firefox-db2pem.sh + @echo "generate a fresh ca-bundle.crt" + ./lib/firefox-db2pem.sh lib/ca-bundle.crt diff --git a/README b/README new file mode 100644 index 0000000000..490faca163 --- /dev/null +++ b/README @@ -0,0 +1,57 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README + + Curl is a command line tool for transferring data specified with URL + syntax. Find out how to use curl by reading the curl.1 man page or the + MANUAL document. Find out how to install Curl by reading the INSTALL + document. + + libcurl is the library curl is using to do its job. It is readily + available to be used by your software. Read the libcurl.3 man page to + learn how! + + You find answers to the most frequent questions we get in the FAQ document. + + Study the COPYING file for distribution terms and similar. If you distribute + curl binaries or other binaries that involve libcurl, you might enjoy the + LICENSE-MIXING document. + + All of those documents and more can be found in the docs/ directory. + +CONTACT + + If you have problems, questions, ideas or suggestions, please contact us + by posting to a suitable mailing list. See https://curl.haxx.se/mail/ + + All contributors to the project are listed in the THANKS document. + +WEB SITE + + Visit the curl web site for the latest news and downloads: + + https://curl.haxx.se/ + +GIT + + To download the very latest source off the GIT server do this: + + git clone https://github.com/curl/curl.git + + (you'll get a directory named curl created, filled with the source code) + +SECURITY PROBLEMS + + Report suspected security problems via our HackerOne page and not in public! + + https://hackerone.com/curl + +NOTICE + + Curl contains pieces of source code that is Copyright (c) 1998, 1999 + Kungliga Tekniska Högskolan. This notice is included here to comply with the + distribution terms. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..16e4b006cf --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +![curl logo](https://curl.haxx.se/logo/curl-logo.svg) + +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/63/badge)](https://bestpractices.coreinfrastructure.org/projects/63) +[![Coverity passed](https://scan.coverity.com/projects/curl/badge.svg)](https://scan.coverity.com/projects/curl) +[![Travis-CI Build Status](https://travis-ci.org/curl/curl.svg?branch=master)](https://travis-ci.org/curl/curl) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/l1vv31029huhf4g4?svg=true)](https://ci.appveyor.com/project/curlorg/curl) +[![Azure DevOps Build Status](https://dev.azure.com/daniel0244/curl/_apis/build/status/curl.curl?branchName=master)](https://dev.azure.com/daniel0244/curl/_build/latest?definitionId=1&branchName=master) +[![Cirrus Build Status](https://api.cirrus-ci.com/github/curl/curl.svg?branch=master)](https://cirrus-ci.com/github/curl/curl) +[![Backers on Open Collective](https://opencollective.com/curl/backers/badge.svg)](#backers) +[![Sponsors on Open Collective](https://opencollective.com/curl/sponsors/badge.svg)](#sponsors) +[![Language Grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/curl/curl.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/curl/curl/context:cpp) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/d11483a0cc5c4ebd9da4ff9f7cd56690)](https://www.codacy.com/app/curl/curl?utm_source=github.com&utm_medium=referral&utm_content=curl/curl&utm_campaign=Badge_Grade) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/curl.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:curl) + +Curl is a command-line tool for transferring data specified with URL +syntax. Find out how to use curl by reading [the curl.1 man +page](https://curl.haxx.se/docs/manpage.html) or [the MANUAL +document](https://curl.haxx.se/docs/manual.html). Find out how to install Curl +by reading [the INSTALL document](https://curl.haxx.se/docs/install.html). + +libcurl is the library curl is using to do its job. It is readily available to +be used by your software. Read [the libcurl.3 man +page](https://curl.haxx.se/libcurl/c/libcurl.html) to learn how! + +You can find answers to the most frequent questions we get in [the FAQ +document](https://curl.haxx.se/docs/faq.html). + +Study [the COPYING file](https://curl.haxx.se/docs/copyright.html) for +distribution terms and similar. If you distribute curl binaries or other +binaries that involve libcurl, you might enjoy [the LICENSE-MIXING +document](https://curl.haxx.se/legal/licmix.html). + +## Contact + +If you have problems, questions, ideas or suggestions, please contact us by +posting to a suitable [mailing list](https://curl.haxx.se/mail/). + +All contributors to the project are listed in [the THANKS +document](https://curl.haxx.se/docs/thanks.html). + +## Website + +Visit the [curl web site](https://curl.haxx.se/) for the latest news and +downloads. + +## Git + +To download the very latest source from the Git server do this: + + git clone https://github.com/curl/curl.git + +(you'll get a directory named curl created, filled with the source code) + +## Security problems + +Report suspected security problems via [our HackerOne +page](https://hackerone.com/curl) and not in public! + +## Notice + +Curl contains pieces of source code that is Copyright (c) 1998, 1999 Kungliga +Tekniska Högskolan. This notice is included here to comply with the +distribution terms. + +## Backers + +Thank you to all our backers! 🙠[[Become a backer](https://opencollective.com/curl#backer)] + + + +## Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a +link to your website. [[Become a +sponsor](https://opencollective.com/curl#sponsor)] + + + + + + + + + + + diff --git a/RELEASE-NOTES b/RELEASE-NOTES new file mode 100644 index 0000000000..ef3e38d14a --- /dev/null +++ b/RELEASE-NOTES @@ -0,0 +1,80 @@ +curl and libcurl 7.69.1 + + Public curl releases: 190 + Command line options: 230 + curl_easy_setopt() options: 270 + Public functions in libcurl: 82 + Contributors: 2133 + +This release includes the following bugfixes: + + o ares: store dns parameters for duphandle [20] + o cirrus-ci: disable the FreeBSD 13 builds [3] + o curl_share_setopt.3: Note sharing cookies doesn't enable the engine [11] + o lib1564: reduce number of mid-wait wakeup calls [16] + o libssh: Fix matching user-specified MD5 hex key [7] + o MANUAL: update a dict-using command line + o mime: do not perform more than one read in a row [18] + o mime: fix the binary encoder to handle large data properly [17] + o mime: latch last read callback status [19] + o multi: skip EINTR check on wakeup socket if it was closed [12] + o pause: bail out on bad input [8] + o pause: force a connection recheck after unpausing (take 2) [5] + o pause: return early for calls that don't change pause state [10] + o runtests.1: rephrase how to specify what tests to run [2] + o runtests: fix missing use of exe_ext helper function + o seek: fix fall back for missing ftruncate on Windows [4] + o sftp: fix segfault regression introduced by #4747 in 7.69.0 [22] + o sha256: Added SecureTransport implementation [15] + o sha256: Added WinCrypt implementation [15] + o socks4: fix host resolve regression [14] + o socks5: host name resolv regression fix [6] + o tests/server: fix missing use of exe_ext helper function [24] + o tests: fix static ip:port instead of dynamic values being used [23] + o tests: make sleeping portable by avoiding select [1] + o unit1612: fix the inclusion and compilation of the HMAC unit test [9] + o urldata: remove the 'stream_was_rewound' connectdata struct member [13] + o version: make curl_version* thread-safe without using global context [21] + +This release includes the following known bugs: + + o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html) + +This release would not have looked like this without help, code, reports and +advice from friends like these: + + amishmm on github, Anders Berg, Andy Fiddaman, Christopher Reid, + Dan Fandrich, Daniel Stenberg, Ernst Sjöstrand, fds242 on github, + Fedor Korotkov, Felipe Gasper, Jim Fuller, Marcel Raad, Marc Hörsken, + MrdUkk on github, Patrick Monnerat, Ray Satiro, RuurdBeerstra on github, + Steve Holme, vitaha85 on github, + (19 contributors) + + Thanks! (and sorry if I forgot to mention someone) + +References to bug reports and discussions on issues: + + [1] = https://curl.haxx.se/bug/?i=5035 + [2] = https://curl.haxx.se/bug/?i=5033 + [3] = https://curl.haxx.se/bug/?i=5028 + [4] = https://curl.haxx.se/bug/?i=5055 + [5] = https://curl.haxx.se/bug/?i=5049 + [6] = https://curl.haxx.se/bug/?i=5053 + [7] = https://curl.haxx.se/bug/?i=4971 + [8] = https://curl.haxx.se/bug/?i=5050 + [9] = https://curl.haxx.se/bug/?i=5024 + [10] = https://curl.haxx.se/bug/?i=5026 + [11] = https://curl.haxx.se/mail/lib-2020-03/0019.html + [12] = https://curl.haxx.se/bug/?i=5047 + [13] = https://curl.haxx.se/bug/?i=5046 + [14] = https://curl.haxx.se/bug/?i=5061 + [15] = https://curl.haxx.se/bug/?i=5030 + [16] = https://curl.haxx.se/bug/?i=5037 + [17] = https://curl.haxx.se/bug/?i=4860 + [18] = https://curl.haxx.se/bug/?i=4826 + [19] = https://curl.haxx.se/bug/?i=4813 + [20] = https://curl.haxx.se/bug/?i=4893 + [21] = https://curl.haxx.se/bug/?i=5010 + [22] = https://curl.haxx.se/bug/?i=5041 + [23] = https://curl.haxx.se/bug/?i=5065 + [24] = https://curl.haxx.se/bug/?i=5064 diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..871c06a503 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,10 @@ +# Security Policy + +See [docs/SECURITY-PROCESS.md](docs/SECURITY-PROCESS.md) for full details. + +## Reporting a Vulnerability + +If you have found or just suspect a security problem somewhere in curl or libcurl, +report it on [https://hackerone.com/curl](https://hackerone.com/curl). + +We treat security issuse with confidentiality until disclosed controlled and responsibly. diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000000..3ad55c3885 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,2572 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +#*************************************************************************** + +dnl CURL_CHECK_DEF (SYMBOL, [INCLUDES], [SILENT]) +dnl ------------------------------------------------- +dnl Use the C preprocessor to find out if the given object-style symbol +dnl is defined and get its expansion. This macro will not use default +dnl includes even if no INCLUDES argument is given. This macro will run +dnl silently when invoked with three arguments. If the expansion would +dnl result in a set of double-quoted strings the returned expansion will +dnl actually be a single double-quoted string concatenating all them. + +AC_DEFUN([CURL_CHECK_DEF], [ + AC_REQUIRE([CURL_CPP_P])dnl + OLDCPPFLAGS=$CPPFLAGS + # CPPPFLAG comes from CURL_CPP_P + CPPFLAGS="$CPPFLAGS $CPPPFLAG" + AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl + AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl + if test -z "$SED"; then + AC_MSG_ERROR([SED not set. Cannot continue without SED being set.]) + fi + if test -z "$GREP"; then + AC_MSG_ERROR([GREP not set. Cannot continue without GREP being set.]) + fi + ifelse($3,,[AC_MSG_CHECKING([for preprocessor definition of $1])]) + tmp_exp="" + AC_PREPROC_IFELSE([ + AC_LANG_SOURCE( +ifelse($2,,,[$2])[[ +#ifdef $1 +CURL_DEF_TOKEN $1 +#endif + ]]) + ],[ + tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \ + "$GREP" CURL_DEF_TOKEN 2>/dev/null | \ + "$SED" 's/.*CURL_DEF_TOKEN[[ ]][[ ]]*//' 2>/dev/null | \ + "$SED" 's/[["]][[ ]]*[["]]//g' 2>/dev/null` + if test -z "$tmp_exp" || test "$tmp_exp" = "$1"; then + tmp_exp="" + fi + ]) + if test -z "$tmp_exp"; then + AS_VAR_SET(ac_HaveDef, no) + ifelse($3,,[AC_MSG_RESULT([no])]) + else + AS_VAR_SET(ac_HaveDef, yes) + AS_VAR_SET(ac_Def, $tmp_exp) + ifelse($3,,[AC_MSG_RESULT([$tmp_exp])]) + fi + AS_VAR_POPDEF([ac_Def])dnl + AS_VAR_POPDEF([ac_HaveDef])dnl + CPPFLAGS=$OLDCPPFLAGS +]) + + +dnl CURL_CHECK_DEF_CC (SYMBOL, [INCLUDES], [SILENT]) +dnl ------------------------------------------------- +dnl Use the C compiler to find out only if the given symbol is defined +dnl or not, this can not find out its expansion. This macro will not use +dnl default includes even if no INCLUDES argument is given. This macro +dnl will run silently when invoked with three arguments. + +AC_DEFUN([CURL_CHECK_DEF_CC], [ + AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl + ifelse($3,,[AC_MSG_CHECKING([for compiler definition of $1])]) + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE( +ifelse($2,,,[$2])[[ +int main (void) +{ +#ifdef $1 + return 0; +#else + force compilation error +#endif +} + ]]) + ],[ + tst_symbol_defined="yes" + ],[ + tst_symbol_defined="no" + ]) + if test "$tst_symbol_defined" = "yes"; then + AS_VAR_SET(ac_HaveDef, yes) + ifelse($3,,[AC_MSG_RESULT([yes])]) + else + AS_VAR_SET(ac_HaveDef, no) + ifelse($3,,[AC_MSG_RESULT([no])]) + fi + AS_VAR_POPDEF([ac_HaveDef])dnl +]) + + +dnl CURL_CHECK_LIB_XNET +dnl ------------------------------------------------- +dnl Verify if X/Open network library is required. + +AC_DEFUN([CURL_CHECK_LIB_XNET], [ + AC_MSG_CHECKING([if X/Open network library is required]) + tst_lib_xnet_required="no" + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([[ +int main (void) +{ +#if defined(__hpux) && defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 600) + return 0; +#elif defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED) + return 0; +#else + force compilation error +#endif +} + ]]) + ],[ + tst_lib_xnet_required="yes" + LIBS="-lxnet $LIBS" + ]) + AC_MSG_RESULT([$tst_lib_xnet_required]) +]) + + +dnl CURL_CHECK_AIX_ALL_SOURCE +dnl ------------------------------------------------- +dnl Provides a replacement of traditional AC_AIX with +dnl an uniform behaviour across all autoconf versions, +dnl and with our own placement rules. + +AC_DEFUN([CURL_CHECK_AIX_ALL_SOURCE], [ + AH_VERBATIM([_ALL_SOURCE], + [/* Define to 1 if OS is AIX. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif]) + AC_BEFORE([$0], [AC_SYS_LARGEFILE])dnl + AC_BEFORE([$0], [CURL_CONFIGURE_REENTRANT])dnl + AC_BEFORE([$0], [CURL_CONFIGURE_PULL_SYS_POLL])dnl + AC_MSG_CHECKING([if OS is AIX (to define _ALL_SOURCE)]) + AC_EGREP_CPP([yes_this_is_aix],[ +#ifdef _AIX + yes_this_is_aix +#endif + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(_ALL_SOURCE) + ],[ + AC_MSG_RESULT([no]) + ]) +]) + + +dnl CURL_CHECK_HEADER_WINDOWS +dnl ------------------------------------------------- +dnl Check for compilable and valid windows.h header + +AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [ + AC_CACHE_CHECK([for windows.h], [curl_cv_header_windows_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) + HAVE_WINDOWS_H shall not be defined. +#else + int dummy=2*WINVER; +#endif + ]]) + ],[ + curl_cv_header_windows_h="yes" + ],[ + curl_cv_header_windows_h="no" + ]) + ]) + case "$curl_cv_header_windows_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1, + [Define to 1 if you have the windows.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_NATIVE_WINDOWS +dnl ------------------------------------------------- +dnl Check if building a native Windows target + +AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_CACHE_CHECK([whether build target is a native Windows one], [curl_cv_native_windows], [ + if test "$curl_cv_header_windows_h" = "no"; then + curl_cv_native_windows="no" + else + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ +#if defined(__MINGW32__) || defined(__MINGW32CE__) || \ + (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64))) + int dummy=1; +#else + Not a native Windows build target. +#endif + ]]) + ],[ + curl_cv_native_windows="yes" + ],[ + curl_cv_native_windows="no" + ]) + fi + ]) + AM_CONDITIONAL(DOING_NATIVE_WINDOWS, test "x$curl_cv_native_windows" = xyes) +]) + + +dnl CURL_CHECK_HEADER_WINSOCK +dnl ------------------------------------------------- +dnl Check for compilable and valid winsock.h header + +AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_CACHE_CHECK([for winsock.h], [curl_cv_header_winsock_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) + HAVE_WINSOCK_H shall not be defined. +#else + int dummy=WSACleanup(); +#endif + ]]) + ],[ + curl_cv_header_winsock_h="yes" + ],[ + curl_cv_header_winsock_h="no" + ]) + ]) + case "$curl_cv_header_winsock_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, + [Define to 1 if you have the winsock.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_WINSOCK2 +dnl ------------------------------------------------- +dnl Check for compilable and valid winsock2.h header + +AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_CACHE_CHECK([for winsock2.h], [curl_cv_header_winsock2_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__) + HAVE_WINSOCK2_H shall not be defined. +#else + int dummy=2*IPPROTO_ESP; +#endif + ]]) + ],[ + curl_cv_header_winsock2_h="yes" + ],[ + curl_cv_header_winsock2_h="no" + ]) + ]) + case "$curl_cv_header_winsock2_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, + [Define to 1 if you have the winsock2.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_WS2TCPIP +dnl ------------------------------------------------- +dnl Check for compilable and valid ws2tcpip.h header + +AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl + AC_CACHE_CHECK([for ws2tcpip.h], [curl_cv_header_ws2tcpip_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__) + HAVE_WS2TCPIP_H shall not be defined. +#else + int dummy=2*IP_PKTINFO; +#endif + ]]) + ],[ + curl_cv_header_ws2tcpip_h="yes" + ],[ + curl_cv_header_ws2tcpip_h="no" + ]) + ]) + case "$curl_cv_header_ws2tcpip_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1, + [Define to 1 if you have the ws2tcpip.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_WINLDAP +dnl ------------------------------------------------- +dnl Check for compilable and valid winldap.h header + +AC_DEFUN([CURL_CHECK_HEADER_WINLDAP], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_CACHE_CHECK([for winldap.h], [curl_cv_header_winldap_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#endif +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) + HAVE_WINLDAP_H shall not be defined. +#else + LDAP *ldp = ldap_init("dummy", LDAP_PORT); + ULONG res = ldap_unbind(ldp); +#endif + ]]) + ],[ + curl_cv_header_winldap_h="yes" + ],[ + curl_cv_header_winldap_h="no" + ]) + ]) + case "$curl_cv_header_winldap_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WINLDAP_H, 1, + [Define to 1 if you have the winldap.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_WINBER +dnl ------------------------------------------------- +dnl Check for compilable and valid winber.h header + +AC_DEFUN([CURL_CHECK_HEADER_WINBER], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINLDAP])dnl + AC_CACHE_CHECK([for winber.h], [curl_cv_header_winber_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#endif +#include +#include + ]],[[ +#if defined(__CYGWIN__) || defined(__CEGCC__) + HAVE_WINBER_H shall not be defined. +#else + BERVAL *bvp = NULL; + BerElement *bep = ber_init(bvp); + ber_free(bep, 1); +#endif + ]]) + ],[ + curl_cv_header_winber_h="yes" + ],[ + curl_cv_header_winber_h="no" + ]) + ]) + case "$curl_cv_header_winber_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_WINBER_H, 1, + [Define to 1 if you have the winber.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_LBER +dnl ------------------------------------------------- +dnl Check for compilable and valid lber.h header, +dnl and check if it is needed even with ldap.h + +AC_DEFUN([CURL_CHECK_HEADER_LBER], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_CACHE_CHECK([for lber.h], [curl_cv_header_lber_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef NULL +#define NULL (void *)0 +#endif +#include + ]],[[ + BerValue *bvp = NULL; + BerElement *bep = ber_init(bvp); + ber_free(bep, 1); + ]]) + ],[ + curl_cv_header_lber_h="yes" + ],[ + curl_cv_header_lber_h="no" + ]) + ]) + if test "$curl_cv_header_lber_h" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_LBER_H, 1, + [Define to 1 if you have the lber.h header file.]) + # + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef NULL +#define NULL (void *)0 +#endif +#ifndef LDAP_DEPRECATED +#define LDAP_DEPRECATED 1 +#endif +#include + ]],[[ + BerValue *bvp = NULL; + BerElement *bep = ber_init(bvp); + ber_free(bep, 1); + ]]) + ],[ + curl_cv_need_header_lber_h="no" + ],[ + curl_cv_need_header_lber_h="yes" + ]) + # + case "$curl_cv_need_header_lber_h" in + yes) + AC_DEFINE_UNQUOTED(NEED_LBER_H, 1, + [Define to 1 if you need the lber.h header file even with ldap.h]) + ;; + esac + fi +]) + + +dnl CURL_CHECK_HEADER_LDAP +dnl ------------------------------------------------- +dnl Check for compilable and valid ldap.h header + +AC_DEFUN([CURL_CHECK_HEADER_LDAP], [ + AC_REQUIRE([CURL_CHECK_HEADER_LBER])dnl + AC_CACHE_CHECK([for ldap.h], [curl_cv_header_ldap_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef LDAP_DEPRECATED +#define LDAP_DEPRECATED 1 +#endif +#ifdef NEED_LBER_H +#include +#endif +#include + ]],[[ + LDAP *ldp = ldap_init("dummy", LDAP_PORT); + int res = ldap_unbind(ldp); + ]]) + ],[ + curl_cv_header_ldap_h="yes" + ],[ + curl_cv_header_ldap_h="no" + ]) + ]) + case "$curl_cv_header_ldap_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_LDAP_H, 1, + [Define to 1 if you have the ldap.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_LDAP_SSL +dnl ------------------------------------------------- +dnl Check for compilable and valid ldap_ssl.h header + +AC_DEFUN([CURL_CHECK_HEADER_LDAP_SSL], [ + AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl + AC_CACHE_CHECK([for ldap_ssl.h], [curl_cv_header_ldap_ssl_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef LDAP_DEPRECATED +#define LDAP_DEPRECATED 1 +#endif +#ifdef NEED_LBER_H +#include +#endif +#ifdef HAVE_LDAP_H +#include +#endif +#include + ]],[[ + LDAP *ldp = ldapssl_init("dummy", LDAPS_PORT, 1); + ]]) + ],[ + curl_cv_header_ldap_ssl_h="yes" + ],[ + curl_cv_header_ldap_ssl_h="no" + ]) + ]) + case "$curl_cv_header_ldap_ssl_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_LDAP_SSL_H, 1, + [Define to 1 if you have the ldap_ssl.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_HEADER_LDAPSSL +dnl ------------------------------------------------- +dnl Check for compilable and valid ldapssl.h header + +AC_DEFUN([CURL_CHECK_HEADER_LDAPSSL], [ + AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl + AC_CACHE_CHECK([for ldapssl.h], [curl_cv_header_ldapssl_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef NULL +#define NULL (void *)0 +#endif +#ifndef LDAP_DEPRECATED +#define LDAP_DEPRECATED 1 +#endif +#ifdef NEED_LBER_H +#include +#endif +#ifdef HAVE_LDAP_H +#include +#endif +#include + ]],[[ + char *cert_label = NULL; + LDAP *ldp = ldap_ssl_init("dummy", LDAPS_PORT, cert_label); + ]]) + ],[ + curl_cv_header_ldapssl_h="yes" + ],[ + curl_cv_header_ldapssl_h="no" + ]) + ]) + case "$curl_cv_header_ldapssl_h" in + yes) + AC_DEFINE_UNQUOTED(HAVE_LDAPSSL_H, 1, + [Define to 1 if you have the ldapssl.h header file.]) + ;; + esac +]) + + +dnl CURL_CHECK_LIBS_WINLDAP +dnl ------------------------------------------------- +dnl Check for libraries needed for WINLDAP support, +dnl and prepended to LIBS any needed libraries. +dnl This macro can take an optional parameter with a +dnl white space separated list of libraries to check +dnl before the WINLDAP default ones. + +AC_DEFUN([CURL_CHECK_LIBS_WINLDAP], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINBER])dnl + # + AC_MSG_CHECKING([for WINLDAP libraries]) + # + u_libs="" + # + ifelse($1,,,[ + for x_lib in $1; do + case "$x_lib" in + -l*) + l_lib="$x_lib" + ;; + *) + l_lib="-l$x_lib" + ;; + esac + if test -z "$u_libs"; then + u_libs="$l_lib" + else + u_libs="$u_libs $l_lib" + fi + done + ]) + # + curl_cv_save_LIBS="$LIBS" + curl_cv_ldap_LIBS="unknown" + # + for x_nlibs in '' "$u_libs" \ + '-lwldap32' ; do + if test "$curl_cv_ldap_LIBS" = "unknown"; then + if test -z "$x_nlibs"; then + LIBS="$curl_cv_save_LIBS" + else + LIBS="$x_nlibs $curl_cv_save_LIBS" + fi + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINLDAP_H +#include +#endif +#ifdef HAVE_WINBER_H +#include +#endif +#endif + ]],[[ + BERVAL *bvp = NULL; + BerElement *bep = ber_init(bvp); + LDAP *ldp = ldap_init("dummy", LDAP_PORT); + ULONG res = ldap_unbind(ldp); + ber_free(bep, 1); + ]]) + ],[ + curl_cv_ldap_LIBS="$x_nlibs" + ]) + fi + done + # + LIBS="$curl_cv_save_LIBS" + # + case X-"$curl_cv_ldap_LIBS" in + X-unknown) + AC_MSG_RESULT([cannot find WINLDAP libraries]) + ;; + X-) + AC_MSG_RESULT([no additional lib required]) + ;; + *) + if test -z "$curl_cv_save_LIBS"; then + LIBS="$curl_cv_ldap_LIBS" + else + LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS" + fi + AC_MSG_RESULT([$curl_cv_ldap_LIBS]) + ;; + esac + # +]) + + +dnl CURL_CHECK_LIBS_LDAP +dnl ------------------------------------------------- +dnl Check for libraries needed for LDAP support, +dnl and prepended to LIBS any needed libraries. +dnl This macro can take an optional parameter with a +dnl white space separated list of libraries to check +dnl before the default ones. + +AC_DEFUN([CURL_CHECK_LIBS_LDAP], [ + AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl + # + AC_MSG_CHECKING([for LDAP libraries]) + # + u_libs="" + # + ifelse($1,,,[ + for x_lib in $1; do + case "$x_lib" in + -l*) + l_lib="$x_lib" + ;; + *) + l_lib="-l$x_lib" + ;; + esac + if test -z "$u_libs"; then + u_libs="$l_lib" + else + u_libs="$u_libs $l_lib" + fi + done + ]) + # + curl_cv_save_LIBS="$LIBS" + curl_cv_ldap_LIBS="unknown" + # + for x_nlibs in '' "$u_libs" \ + '-lldap' \ + '-lldap -llber' \ + '-llber -lldap' \ + '-lldapssl -lldapx -lldapsdk' \ + '-lldapsdk -lldapx -lldapssl' \ + '-lldap -llber -lssl -lcrypto' ; do + + if test "$curl_cv_ldap_LIBS" = "unknown"; then + if test -z "$x_nlibs"; then + LIBS="$curl_cv_save_LIBS" + else + LIBS="$x_nlibs $curl_cv_save_LIBS" + fi + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#endif +#ifndef NULL +#define NULL (void *)0 +#endif +#ifndef LDAP_DEPRECATED +#define LDAP_DEPRECATED 1 +#endif +#ifdef NEED_LBER_H +#include +#endif +#ifdef HAVE_LDAP_H +#include +#endif + ]],[[ + BerValue *bvp = NULL; + BerElement *bep = ber_init(bvp); + LDAP *ldp = ldap_init("dummy", LDAP_PORT); + int res = ldap_unbind(ldp); + ber_free(bep, 1); + ]]) + ],[ + curl_cv_ldap_LIBS="$x_nlibs" + ]) + fi + done + # + LIBS="$curl_cv_save_LIBS" + # + case X-"$curl_cv_ldap_LIBS" in + X-unknown) + AC_MSG_RESULT([cannot find LDAP libraries]) + ;; + X-) + AC_MSG_RESULT([no additional lib required]) + ;; + *) + if test -z "$curl_cv_save_LIBS"; then + LIBS="$curl_cv_ldap_LIBS" + else + LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS" + fi + AC_MSG_RESULT([$curl_cv_ldap_LIBS]) + ;; + esac + # +]) + + +dnl CURL_CHECK_HEADER_MALLOC +dnl ------------------------------------------------- +dnl Check for compilable and valid malloc.h header, +dnl and check if it is needed even with stdlib.h + +AC_DEFUN([CURL_CHECK_HEADER_MALLOC], [ + AC_CACHE_CHECK([for malloc.h], [curl_cv_header_malloc_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + void *p = malloc(10); + void *q = calloc(10,10); + free(p); + free(q); + ]]) + ],[ + curl_cv_header_malloc_h="yes" + ],[ + curl_cv_header_malloc_h="no" + ]) + ]) + if test "$curl_cv_header_malloc_h" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_MALLOC_H, 1, + [Define to 1 if you have the malloc.h header file.]) + # + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + void *p = malloc(10); + void *q = calloc(10,10); + free(p); + free(q); + ]]) + ],[ + curl_cv_need_header_malloc_h="no" + ],[ + curl_cv_need_header_malloc_h="yes" + ]) + # + case "$curl_cv_need_header_malloc_h" in + yes) + AC_DEFINE_UNQUOTED(NEED_MALLOC_H, 1, + [Define to 1 if you need the malloc.h header file even with stdlib.h]) + ;; + esac + fi +]) + + +dnl CURL_CHECK_HEADER_MEMORY +dnl ------------------------------------------------- +dnl Check for compilable and valid memory.h header, +dnl and check if it is needed even with stdlib.h for +dnl memory related functions. + +AC_DEFUN([CURL_CHECK_HEADER_MEMORY], [ + AC_CACHE_CHECK([for memory.h], [curl_cv_header_memory_h], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + void *p = malloc(10); + void *q = calloc(10,10); + free(p); + free(q); + ]]) + ],[ + curl_cv_header_memory_h="yes" + ],[ + curl_cv_header_memory_h="no" + ]) + ]) + if test "$curl_cv_header_memory_h" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_MEMORY_H, 1, + [Define to 1 if you have the memory.h header file.]) + # + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + void *p = malloc(10); + void *q = calloc(10,10); + free(p); + free(q); + ]]) + ],[ + curl_cv_need_header_memory_h="no" + ],[ + curl_cv_need_header_memory_h="yes" + ]) + # + case "$curl_cv_need_header_memory_h" in + yes) + AC_DEFINE_UNQUOTED(NEED_MEMORY_H, 1, + [Define to 1 if you need the memory.h header file even with stdlib.h]) + ;; + esac + fi +]) + +dnl TYPE_SOCKADDR_STORAGE +dnl ------------------------------------------------- +dnl Check for struct sockaddr_storage. Most IPv6-enabled +dnl hosts have it, but AIX 4.3 is one known exception. + +AC_DEFUN([TYPE_SOCKADDR_STORAGE], +[ + AC_CHECK_TYPE([struct sockaddr_storage], + AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, + [if struct sockaddr_storage is defined]), , + [ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#endif + ]) +]) + +dnl CURL_CHECK_FUNC_RECV +dnl ------------------------------------------------- +dnl Test if the socket recv() function is available, +dnl and check its return type and the types of its +dnl arguments. If the function succeeds HAVE_RECV +dnl will be defined, defining the types of the arguments +dnl in RECV_TYPE_ARG1, RECV_TYPE_ARG2, RECV_TYPE_ARG3 +dnl and RECV_TYPE_ARG4, defining the type of the function +dnl return value in RECV_TYPE_RETV. + +AC_DEFUN([CURL_CHECK_FUNC_RECV], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl + AC_CHECK_HEADERS(sys/types.h sys/socket.h) + # + AC_MSG_CHECKING([for recv]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#else +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#endif + ]],[[ + recv(0, 0, 0, 0); + ]]) + ],[ + AC_MSG_RESULT([yes]) + curl_cv_recv="yes" + ],[ + AC_MSG_RESULT([no]) + curl_cv_recv="no" + ]) + # + if test "$curl_cv_recv" = "yes"; then + AC_CACHE_CHECK([types of args and return type for recv], + [curl_cv_func_recv_args], [ + curl_cv_func_recv_args="unknown" + for recv_retv in 'int' 'ssize_t'; do + for recv_arg1 in 'int' 'ssize_t' 'SOCKET'; do + for recv_arg2 in 'char *' 'void *'; do + for recv_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do + for recv_arg4 in 'int' 'unsigned int'; do + if test "$curl_cv_func_recv_args" = "unknown"; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#define RECVCALLCONV PASCAL +#else +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#define RECVCALLCONV +#endif +#ifndef HAVE_PROTO_BSDSOCKET_H + extern $recv_retv RECVCALLCONV + recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4); +#endif + ]],[[ + $recv_arg1 s=0; + $recv_arg2 buf=0; + $recv_arg3 len=0; + $recv_arg4 flags=0; + $recv_retv res = recv(s, buf, len, flags); + ]]) + ],[ + curl_cv_func_recv_args="$recv_arg1,$recv_arg2,$recv_arg3,$recv_arg4,$recv_retv" + ]) + fi + done + done + done + done + done + ]) # AC-CACHE-CHECK + if test "$curl_cv_func_recv_args" = "unknown"; then + AC_MSG_ERROR([Cannot find proper types to use for recv args]) + else + recv_prev_IFS=$IFS; IFS=',' + set dummy `echo "$curl_cv_func_recv_args" | sed 's/\*/\*/g'` + IFS=$recv_prev_IFS + shift + # + AC_DEFINE_UNQUOTED(RECV_TYPE_ARG1, $[1], + [Define to the type of arg 1 for recv.]) + AC_DEFINE_UNQUOTED(RECV_TYPE_ARG2, $[2], + [Define to the type of arg 2 for recv.]) + AC_DEFINE_UNQUOTED(RECV_TYPE_ARG3, $[3], + [Define to the type of arg 3 for recv.]) + AC_DEFINE_UNQUOTED(RECV_TYPE_ARG4, $[4], + [Define to the type of arg 4 for recv.]) + AC_DEFINE_UNQUOTED(RECV_TYPE_RETV, $[5], + [Define to the function return type for recv.]) + # + AC_DEFINE_UNQUOTED(HAVE_RECV, 1, + [Define to 1 if you have the recv function.]) + curl_cv_func_recv="yes" + fi + else + AC_MSG_ERROR([Unable to link function recv]) + fi +]) + + +dnl CURL_CHECK_FUNC_SEND +dnl ------------------------------------------------- +dnl Test if the socket send() function is available, +dnl and check its return type and the types of its +dnl arguments. If the function succeeds HAVE_SEND +dnl will be defined, defining the types of the arguments +dnl in SEND_TYPE_ARG1, SEND_TYPE_ARG2, SEND_TYPE_ARG3 +dnl and SEND_TYPE_ARG4, defining the type of the function +dnl return value in SEND_TYPE_RETV, and also defining the +dnl type qualifier of second argument in SEND_QUAL_ARG2. + +AC_DEFUN([CURL_CHECK_FUNC_SEND], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl + AC_CHECK_HEADERS(sys/types.h sys/socket.h) + # + AC_MSG_CHECKING([for send]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#else +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#endif + ]],[[ + send(0, 0, 0, 0); + ]]) + ],[ + AC_MSG_RESULT([yes]) + curl_cv_send="yes" + ],[ + AC_MSG_RESULT([no]) + curl_cv_send="no" + ]) + # + if test "$curl_cv_send" = "yes"; then + AC_CACHE_CHECK([types of args and return type for send], + [curl_cv_func_send_args], [ + curl_cv_func_send_args="unknown" + for send_retv in 'int' 'ssize_t'; do + for send_arg1 in 'int' 'ssize_t' 'SOCKET'; do + for send_arg2 in 'char *' 'void *' 'const char *' 'const void *'; do + for send_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do + for send_arg4 in 'int' 'unsigned int'; do + if test "$curl_cv_func_send_args" = "unknown"; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#define SENDCALLCONV PASCAL +#else +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#define SENDCALLCONV +#endif +#ifndef HAVE_PROTO_BSDSOCKET_H + extern $send_retv SENDCALLCONV + send($send_arg1, $send_arg2, $send_arg3, $send_arg4); +#endif + ]],[[ + $send_arg1 s=0; + $send_arg3 len=0; + $send_arg4 flags=0; + $send_retv res = send(s, 0, len, flags); + ]]) + ],[ + curl_cv_func_send_args="$send_arg1,$send_arg2,$send_arg3,$send_arg4,$send_retv" + ]) + fi + done + done + done + done + done + ]) # AC-CACHE-CHECK + if test "$curl_cv_func_send_args" = "unknown"; then + AC_MSG_ERROR([Cannot find proper types to use for send args]) + else + send_prev_IFS=$IFS; IFS=',' + set dummy `echo "$curl_cv_func_send_args" | sed 's/\*/\*/g'` + IFS=$send_prev_IFS + shift + # + send_qual_type_arg2=$[2] + # + AC_DEFINE_UNQUOTED(SEND_TYPE_ARG1, $[1], + [Define to the type of arg 1 for send.]) + AC_DEFINE_UNQUOTED(SEND_TYPE_ARG3, $[3], + [Define to the type of arg 3 for send.]) + AC_DEFINE_UNQUOTED(SEND_TYPE_ARG4, $[4], + [Define to the type of arg 4 for send.]) + AC_DEFINE_UNQUOTED(SEND_TYPE_RETV, $[5], + [Define to the function return type for send.]) + # + prev_sh_opts=$- + # + case $prev_sh_opts in + *f*) + ;; + *) + set -f + ;; + esac + # + case "$send_qual_type_arg2" in + const*) + send_qual_arg2=const + send_type_arg2=`echo $send_qual_type_arg2 | sed 's/^const //'` + ;; + *) + send_qual_arg2= + send_type_arg2=$send_qual_type_arg2 + ;; + esac + # + AC_DEFINE_UNQUOTED(SEND_QUAL_ARG2, $send_qual_arg2, + [Define to the type qualifier of arg 2 for send.]) + AC_DEFINE_UNQUOTED(SEND_TYPE_ARG2, $send_type_arg2, + [Define to the type of arg 2 for send.]) + # + case $prev_sh_opts in + *f*) + ;; + *) + set +f + ;; + esac + # + AC_DEFINE_UNQUOTED(HAVE_SEND, 1, + [Define to 1 if you have the send function.]) + curl_cv_func_send="yes" + fi + else + AC_MSG_ERROR([Unable to link function send]) + fi +]) + +dnl CURL_CHECK_MSG_NOSIGNAL +dnl ------------------------------------------------- +dnl Check for MSG_NOSIGNAL + +AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [ + AC_CHECK_HEADERS(sys/types.h sys/socket.h) + AC_CACHE_CHECK([for MSG_NOSIGNAL], [curl_cv_msg_nosignal], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#else +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#endif + ]],[[ + int flag=MSG_NOSIGNAL; + ]]) + ],[ + curl_cv_msg_nosignal="yes" + ],[ + curl_cv_msg_nosignal="no" + ]) + ]) + case "$curl_cv_msg_nosignal" in + yes) + AC_DEFINE_UNQUOTED(HAVE_MSG_NOSIGNAL, 1, + [Define to 1 if you have the MSG_NOSIGNAL flag.]) + ;; + esac +]) + + +dnl CURL_CHECK_STRUCT_TIMEVAL +dnl ------------------------------------------------- +dnl Check for timeval struct + +AC_DEFUN([CURL_CHECK_STRUCT_TIMEVAL], [ + AC_REQUIRE([AC_HEADER_TIME])dnl + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl + AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl + AC_CHECK_HEADERS(sys/types.h sys/time.h time.h sys/socket.h) + AC_CACHE_CHECK([for struct timeval], [curl_cv_struct_timeval], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + ]],[[ + struct timeval ts; + ts.tv_sec = 0; + ts.tv_usec = 0; + ]]) + ],[ + curl_cv_struct_timeval="yes" + ],[ + curl_cv_struct_timeval="no" + ]) + ]) + case "$curl_cv_struct_timeval" in + yes) + AC_DEFINE_UNQUOTED(HAVE_STRUCT_TIMEVAL, 1, + [Define to 1 if you have the timeval struct.]) + ;; + esac +]) + + +dnl TYPE_SIG_ATOMIC_T +dnl ------------------------------------------------- +dnl Check if the sig_atomic_t type is available, and +dnl verify if it is already defined as volatile. + +AC_DEFUN([TYPE_SIG_ATOMIC_T], [ + AC_CHECK_HEADERS(signal.h) + AC_CHECK_TYPE([sig_atomic_t],[ + AC_DEFINE(HAVE_SIG_ATOMIC_T, 1, + [Define to 1 if sig_atomic_t is an available typedef.]) + ], ,[ +#ifdef HAVE_SIGNAL_H +#include +#endif + ]) + case "$ac_cv_type_sig_atomic_t" in + yes) + # + AC_MSG_CHECKING([if sig_atomic_t is already defined as volatile]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#ifdef HAVE_SIGNAL_H +#include +#endif + ]],[[ + static volatile sig_atomic_t dummy = 0; + ]]) + ],[ + AC_MSG_RESULT([no]) + curl_cv_sig_atomic_t_volatile="no" + ],[ + AC_MSG_RESULT([yes]) + curl_cv_sig_atomic_t_volatile="yes" + ]) + # + if test "$curl_cv_sig_atomic_t_volatile" = "yes"; then + AC_DEFINE(HAVE_SIG_ATOMIC_T_VOLATILE, 1, + [Define to 1 if sig_atomic_t is already defined as volatile.]) + fi + ;; + esac +]) + + +dnl TYPE_IN_ADDR_T +dnl ------------------------------------------------- +dnl Check for in_addr_t: it is used to receive the return code of inet_addr() +dnl and a few other things. + +AC_DEFUN([TYPE_IN_ADDR_T], [ + AC_CHECK_TYPE([in_addr_t], ,[ + dnl in_addr_t not available + AC_CACHE_CHECK([for in_addr_t equivalent], + [curl_cv_in_addr_t_equiv], [ + curl_cv_in_addr_t_equiv="unknown" + for t in "unsigned long" int size_t unsigned long; do + if test "$curl_cv_in_addr_t_equiv" = "unknown"; then + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#endif + ]],[[ + $t data = inet_addr ("1.2.3.4"); + ]]) + ],[ + curl_cv_in_addr_t_equiv="$t" + ]) + fi + done + ]) + case "$curl_cv_in_addr_t_equiv" in + unknown) + AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t]) + ;; + *) + AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, + [Type to use in place of in_addr_t when system does not provide it.]) + ;; + esac + ],[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#endif + ]) +]) + + +dnl CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC +dnl ------------------------------------------------- +dnl Check if monotonic clock_gettime is available. + +AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [ + AC_REQUIRE([AC_HEADER_TIME])dnl + AC_CHECK_HEADERS(sys/types.h sys/time.h time.h) + AC_MSG_CHECKING([for monotonic clock_gettime]) + # + if test "x$dontwant_rt" = "xno" ; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif + ]],[[ + struct timespec ts; + (void)clock_gettime(CLOCK_MONOTONIC, &ts); + ]]) + ],[ + AC_MSG_RESULT([yes]) + curl_func_clock_gettime="yes" + ],[ + AC_MSG_RESULT([no]) + curl_func_clock_gettime="no" + ]) + fi + dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally postponed + dnl until library linking and run-time checks for clock_gettime succeed. +]) + + +dnl CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC +dnl ------------------------------------------------- +dnl If monotonic clock_gettime is available then, +dnl check and prepended to LIBS any needed libraries. + +AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [ + AC_REQUIRE([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC])dnl + # + if test "$curl_func_clock_gettime" = "yes"; then + # + AC_MSG_CHECKING([for clock_gettime in libraries]) + # + curl_cv_save_LIBS="$LIBS" + curl_cv_gclk_LIBS="unknown" + # + for x_xlibs in '' '-lrt' '-lposix4' ; do + if test "$curl_cv_gclk_LIBS" = "unknown"; then + if test -z "$x_xlibs"; then + LIBS="$curl_cv_save_LIBS" + else + LIBS="$x_xlibs $curl_cv_save_LIBS" + fi + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif + ]],[[ + struct timespec ts; + (void)clock_gettime(CLOCK_MONOTONIC, &ts); + ]]) + ],[ + curl_cv_gclk_LIBS="$x_xlibs" + ]) + fi + done + # + LIBS="$curl_cv_save_LIBS" + # + case X-"$curl_cv_gclk_LIBS" in + X-unknown) + AC_MSG_RESULT([cannot find clock_gettime]) + AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined]) + curl_func_clock_gettime="no" + ;; + X-) + AC_MSG_RESULT([no additional lib required]) + curl_func_clock_gettime="yes" + ;; + *) + if test -z "$curl_cv_save_LIBS"; then + LIBS="$curl_cv_gclk_LIBS" + else + LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS" + fi + AC_MSG_RESULT([$curl_cv_gclk_LIBS]) + curl_func_clock_gettime="yes" + ;; + esac + # + dnl only do runtime verification when not cross-compiling + if test "x$cross_compiling" != "xyes" && + test "$curl_func_clock_gettime" = "yes"; then + AC_MSG_CHECKING([if monotonic clock_gettime works]) + CURL_RUN_IFELSE([ + AC_LANG_PROGRAM([[ +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif + ]],[[ + struct timespec ts; + if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) + exit(0); + else + exit(1); + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined]) + curl_func_clock_gettime="no" + LIBS="$curl_cv_save_LIBS" + ]) + fi + # + case "$curl_func_clock_gettime" in + yes) + AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME_MONOTONIC, 1, + [Define to 1 if you have the clock_gettime function and monotonic timer.]) + ;; + esac + # + fi + # +]) + + +dnl CURL_CHECK_LIBS_CONNECT +dnl ------------------------------------------------- +dnl Verify if network connect function is already available +dnl using current libraries or if another one is required. + +AC_DEFUN([CURL_CHECK_LIBS_CONNECT], [ + AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl + AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl + AC_MSG_CHECKING([for connect in libraries]) + tst_connect_save_LIBS="$LIBS" + tst_connect_need_LIBS="unknown" + for tst_lib in '' '-lsocket' ; do + if test "$tst_connect_need_LIBS" = "unknown"; then + LIBS="$tst_lib $tst_connect_save_LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + $curl_includes_winsock2 + $curl_includes_bsdsocket + #if !defined(HAVE_WINDOWS_H) && !defined(HAVE_PROTO_BSDSOCKET_H) + int connect(int, void*, int); + #endif + ]],[[ + if(0 != connect(0, 0, 0)) + return 1; + ]]) + ],[ + tst_connect_need_LIBS="$tst_lib" + ]) + fi + done + LIBS="$tst_connect_save_LIBS" + # + case X-"$tst_connect_need_LIBS" in + X-unknown) + AC_MSG_RESULT([cannot find connect]) + AC_MSG_ERROR([cannot find connect function in libraries.]) + ;; + X-) + AC_MSG_RESULT([yes]) + ;; + *) + AC_MSG_RESULT([$tst_connect_need_LIBS]) + LIBS="$tst_connect_need_LIBS $tst_connect_save_LIBS" + ;; + esac +]) + + +dnl CURL_DEFINE_UNQUOTED (VARIABLE, [VALUE]) +dnl ------------------------------------------------- +dnl Like AC_DEFINE_UNQUOTED this macro will define a C preprocessor +dnl symbol that can be further used in custom template configuration +dnl files. This macro, unlike AC_DEFINE_UNQUOTED, does not use a third +dnl argument for the description. Symbol definitions done with this +dnl macro are intended to be exclusively used in handcrafted *.h.in +dnl template files. Contrary to what AC_DEFINE_UNQUOTED does, this one +dnl prevents autoheader generation and insertion of symbol template +dnl stub and definition into the first configuration header file. Do +dnl not use this macro as a replacement for AC_DEFINE_UNQUOTED, each +dnl one serves different functional needs. + +AC_DEFUN([CURL_DEFINE_UNQUOTED], [ +cat >>confdefs.h <<_EOF +[@%:@define] $1 ifelse($#, 2, [$2], 1) +_EOF +]) + +dnl CURL_CONFIGURE_PULL_SYS_POLL +dnl ------------------------------------------------- +dnl The need for the sys/poll.h inclusion arises mainly to properly +dnl interface AIX systems which define macros 'events' and 'revents'. + +AC_DEFUN([CURL_CONFIGURE_PULL_SYS_POLL], [ + AC_REQUIRE([CURL_INCLUDES_POLL])dnl + # + tst_poll_events_macro_defined="unknown" + # + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + $curl_includes_poll + ]],[[ +#if defined(events) || defined(revents) + return 0; +#else + force compilation error +#endif + ]]) + ],[ + tst_poll_events_macro_defined="yes" + ],[ + tst_poll_events_macro_defined="no" + ]) + # + if test "$tst_poll_events_macro_defined" = "yes"; then + if test "x$ac_cv_header_sys_poll_h" = "xyes"; then + CURL_DEFINE_UNQUOTED([CURL_PULL_SYS_POLL_H]) + fi + fi + # +]) + + +dnl CURL_CHECK_FUNC_SELECT +dnl ------------------------------------------------- +dnl Test if the socket select() function is available, +dnl and check its return type and the types of its +dnl arguments. If the function succeeds HAVE_SELECT +dnl will be defined, defining the types of the +dnl arguments in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234 +dnl and SELECT_TYPE_ARG5, defining the type of the +dnl function return value in SELECT_TYPE_RETV, and +dnl also defining the type qualifier of fifth argument +dnl in SELECT_QUAL_ARG5. + +AC_DEFUN([CURL_CHECK_FUNC_SELECT], [ + AC_REQUIRE([CURL_CHECK_STRUCT_TIMEVAL])dnl + AC_CHECK_HEADERS(sys/select.h sys/socket.h) + # + AC_MSG_CHECKING([for select]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif +#ifndef HAVE_WINDOWS_H +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0) +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#endif + ]],[[ + select(0, 0, 0, 0, 0); + ]]) + ],[ + AC_MSG_RESULT([yes]) + curl_cv_select="yes" + ],[ + AC_MSG_RESULT([no]) + curl_cv_select="no" + ]) + # + if test "$curl_cv_select" = "yes"; then + AC_CACHE_CHECK([types of args and return type for select], + [curl_cv_func_select_args], [ + curl_cv_func_select_args="unknown" + for sel_retv in 'int' 'ssize_t'; do + for sel_arg1 in 'int' 'ssize_t' 'size_t' 'unsigned long int' 'unsigned int'; do + for sel_arg234 in 'fd_set *' 'int *' 'void *'; do + for sel_arg5 in 'struct timeval *' 'const struct timeval *'; do + if test "$curl_cv_func_select_args" = "unknown"; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#define SELECTCALLCONV PASCAL +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#ifdef TIME_WITH_SYS_TIME +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#endif +#endif +#ifndef HAVE_WINDOWS_H +#ifdef HAVE_PROTO_BSDSOCKET_H +#include +struct Library *SocketBase = NULL; +#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0) +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#define SELECTCALLCONV +#endif +#ifndef HAVE_STRUCT_TIMEVAL + struct timeval { + long tv_sec; + long tv_usec; + }; +#endif +#ifndef HAVE_PROTO_BSDSOCKET_H + extern $sel_retv SELECTCALLCONV + select($sel_arg1, + $sel_arg234, + $sel_arg234, + $sel_arg234, + $sel_arg5); +#endif + ]],[[ + $sel_arg1 nfds=0; + $sel_arg234 rfds=0; + $sel_arg234 wfds=0; + $sel_arg234 efds=0; + $sel_retv res = select(nfds, rfds, wfds, efds, 0); + ]]) + ],[ + curl_cv_func_select_args="$sel_arg1,$sel_arg234,$sel_arg5,$sel_retv" + ]) + fi + done + done + done + done + ]) # AC-CACHE-CHECK + if test "$curl_cv_func_select_args" = "unknown"; then + AC_MSG_WARN([Cannot find proper types to use for select args]) + AC_MSG_WARN([HAVE_SELECT will not be defined]) + else + select_prev_IFS=$IFS; IFS=',' + set dummy `echo "$curl_cv_func_select_args" | sed 's/\*/\*/g'` + IFS=$select_prev_IFS + shift + # + sel_qual_type_arg5=$[3] + # + AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1, $[1], + [Define to the type of arg 1 for select.]) + AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234, $[2], + [Define to the type of args 2, 3 and 4 for select.]) + AC_DEFINE_UNQUOTED(SELECT_TYPE_RETV, $[4], + [Define to the function return type for select.]) + # + prev_sh_opts=$- + # + case $prev_sh_opts in + *f*) + ;; + *) + set -f + ;; + esac + # + case "$sel_qual_type_arg5" in + const*) + sel_qual_arg5=const + sel_type_arg5=`echo $sel_qual_type_arg5 | sed 's/^const //'` + ;; + *) + sel_qual_arg5= + sel_type_arg5=$sel_qual_type_arg5 + ;; + esac + # + AC_DEFINE_UNQUOTED(SELECT_QUAL_ARG5, $sel_qual_arg5, + [Define to the type qualifier of arg 5 for select.]) + AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5, $sel_type_arg5, + [Define to the type of arg 5 for select.]) + # + case $prev_sh_opts in + *f*) + ;; + *) + set +f + ;; + esac + # + AC_DEFINE_UNQUOTED(HAVE_SELECT, 1, + [Define to 1 if you have the select function.]) + curl_cv_func_select="yes" + fi + fi +]) + + +dnl CURL_VERIFY_RUNTIMELIBS +dnl ------------------------------------------------- +dnl Verify that the shared libs found so far can be used when running +dnl programs, since otherwise the situation will create odd configure errors +dnl that are misleading people. +dnl +dnl Make sure this test is run BEFORE the first test in the script that +dnl runs anything, which at the time of this writing is the AC_CHECK_SIZEOF +dnl macro. It must also run AFTER all lib-checking macros are complete. + +AC_DEFUN([CURL_VERIFY_RUNTIMELIBS], [ + + dnl this test is of course not sensible if we are cross-compiling! + if test "x$cross_compiling" != xyes; then + + dnl just run a program to verify that the libs checked for previous to this + dnl point also is available run-time! + AC_MSG_CHECKING([run-time libs availability]) + CURL_RUN_IFELSE([ +int main() +{ + return 0; +} +], + AC_MSG_RESULT([fine]), + AC_MSG_RESULT([failed]) + AC_MSG_ERROR([one or more libs available at link-time are not available run-time. Libs used at link-time: $LIBS]) + ) + + dnl if this test fails, configure has already stopped + fi +]) + + +dnl CURL_CHECK_VARIADIC_MACROS +dnl ------------------------------------------------- +dnl Check compiler support of variadic macros + +AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [ + AC_CACHE_CHECK([for compiler support of C99 variadic macro style], + [curl_cv_variadic_macros_c99], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__) +#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__) + int fun3(int arg1, int arg2, int arg3); + int fun2(int arg1, int arg2); + int fun3(int arg1, int arg2, int arg3) + { return arg1 + arg2 + arg3; } + int fun2(int arg1, int arg2) + { return arg1 + arg2; } + ]],[[ + int res3 = c99_vmacro3(1, 2, 3); + int res2 = c99_vmacro2(1, 2); + ]]) + ],[ + curl_cv_variadic_macros_c99="yes" + ],[ + curl_cv_variadic_macros_c99="no" + ]) + ]) + case "$curl_cv_variadic_macros_c99" in + yes) + AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1, + [Define to 1 if compiler supports C99 variadic macro style.]) + ;; + esac + AC_CACHE_CHECK([for compiler support of old gcc variadic macro style], + [curl_cv_variadic_macros_gcc], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#define gcc_vmacro3(first, args...) fun3(first, args) +#define gcc_vmacro2(first, args...) fun2(first, args) + int fun3(int arg1, int arg2, int arg3); + int fun2(int arg1, int arg2); + int fun3(int arg1, int arg2, int arg3) + { return arg1 + arg2 + arg3; } + int fun2(int arg1, int arg2) + { return arg1 + arg2; } + ]],[[ + int res3 = gcc_vmacro3(1, 2, 3); + int res2 = gcc_vmacro2(1, 2); + ]]) + ],[ + curl_cv_variadic_macros_gcc="yes" + ],[ + curl_cv_variadic_macros_gcc="no" + ]) + ]) + case "$curl_cv_variadic_macros_gcc" in + yes) + AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1, + [Define to 1 if compiler supports old gcc variadic macro style.]) + ;; + esac +]) + + +dnl CURL_CHECK_CA_BUNDLE +dnl ------------------------------------------------- +dnl Check if a default ca-bundle should be used +dnl +dnl regarding the paths this will scan: +dnl /etc/ssl/certs/ca-certificates.crt Debian systems +dnl /etc/pki/tls/certs/ca-bundle.crt Redhat and Mandriva +dnl /usr/share/ssl/certs/ca-bundle.crt old(er) Redhat +dnl /usr/local/share/certs/ca-root-nss.crt FreeBSD +dnl /etc/ssl/cert.pem OpenBSD, FreeBSD (symlink) +dnl /etc/ssl/certs/ (ca path) SUSE + +AC_DEFUN([CURL_CHECK_CA_BUNDLE], [ + + AC_MSG_CHECKING([default CA cert bundle/path]) + + AC_ARG_WITH(ca-bundle, +AC_HELP_STRING([--with-ca-bundle=FILE], +[Path to a file containing CA certificates (example: /etc/ca-bundle.crt)]) +AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]), + [ + want_ca="$withval" + if test "x$want_ca" = "xyes"; then + AC_MSG_ERROR([--with-ca-bundle=FILE requires a path to the CA bundle]) + fi + ], + [ want_ca="unset" ]) + AC_ARG_WITH(ca-path, +AC_HELP_STRING([--with-ca-path=DIRECTORY], +[Path to a directory containing CA certificates stored individually, with \ +their filenames in a hash format. This option can be used with the OpenSSL, \ +GnuTLS and mbedTLS backends. Refer to OpenSSL c_rehash for details. \ +(example: /etc/certificates)]) +AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]), + [ + want_capath="$withval" + if test "x$want_capath" = "xyes"; then + AC_MSG_ERROR([--with-ca-path=DIRECTORY requires a path to the CA path directory]) + fi + ], + [ want_capath="unset"]) + + ca_warning=" (warning: certs not found)" + capath_warning=" (warning: certs not found)" + check_capath="" + + if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \ + "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then + dnl both given + ca="$want_ca" + capath="$want_capath" + elif test "x$want_ca" != "xno" -a "x$want_ca" != "xunset"; then + dnl --with-ca-bundle given + ca="$want_ca" + capath="no" + elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then + dnl --with-ca-path given + if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$MBEDTLS_ENABLED" != "x1"; then + AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or mbedTLS]) + fi + capath="$want_capath" + ca="no" + else + dnl first try autodetecting a CA bundle , then a CA path + dnl both autodetections can be skipped by --without-ca-* + ca="no" + capath="no" + if test "x$cross_compiling" != "xyes"; then + dnl NOT cross-compiling and... + dnl neither of the --with-ca-* options are provided + if test "x$want_ca" = "xunset"; then + dnl the path we previously would have installed the curl ca bundle + dnl to, and thus we now check for an already existing cert in that + dnl place in case we find no other + if test "x$prefix" != xNONE; then + cac="${prefix}/share/curl/curl-ca-bundle.crt" + else + cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt" + fi + + for a in /etc/ssl/certs/ca-certificates.crt \ + /etc/pki/tls/certs/ca-bundle.crt \ + /usr/share/ssl/certs/ca-bundle.crt \ + /usr/local/share/certs/ca-root-nss.crt \ + /etc/ssl/cert.pem \ + "$cac"; do + if test -f "$a"; then + ca="$a" + break + fi + done + fi + if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \ + "x$OPENSSL_ENABLED" = "x1"; then + check_capath="/etc/ssl/certs/" + fi + else + dnl no option given and cross-compiling + AC_MSG_WARN([skipped the ca-cert path detection when cross-compiling]) + fi + fi + + if test "x$ca" = "xno" || test -f "$ca"; then + ca_warning="" + fi + + if test "x$capath" != "xno"; then + check_capath="$capath" + fi + + if test ! -z "$check_capath"; then + for a in "$check_capath"; do + if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then + if test "x$capath" = "xno"; then + capath="$a" + fi + capath_warning="" + break + fi + done + fi + + if test "x$capath" = "xno"; then + capath_warning="" + fi + + if test "x$ca" != "xno"; then + CURL_CA_BUNDLE='"'$ca'"' + AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle]) + AC_SUBST(CURL_CA_BUNDLE) + AC_MSG_RESULT([$ca]) + fi + if test "x$capath" != "xno"; then + CURL_CA_PATH="\"$capath\"" + AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path]) + AC_MSG_RESULT([$capath (capath)]) + fi + if test "x$ca" = "xno" && test "x$capath" = "xno"; then + AC_MSG_RESULT([no]) + fi + + AC_MSG_CHECKING([whether to use builtin CA store of SSL library]) + AC_ARG_WITH(ca-fallback, +AC_HELP_STRING([--with-ca-fallback], [Use the built in CA store of the SSL library]) +AC_HELP_STRING([--without-ca-fallback], [Don't use the built in CA store of the SSL library]), + [ + if test "x$with_ca_fallback" != "xyes" -a "x$with_ca_fallback" != "xno"; then + AC_MSG_ERROR([--with-ca-fallback only allows yes or no as parameter]) + fi + ], + [ with_ca_fallback="no"]) + AC_MSG_RESULT([$with_ca_fallback]) + if test "x$with_ca_fallback" = "xyes"; then + if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1"; then + AC_MSG_ERROR([--with-ca-fallback only works with OpenSSL or GnuTLS]) + fi + AC_DEFINE_UNQUOTED(CURL_CA_FALLBACK, 1, [define "1" to use built in CA store of SSL library ]) + fi +]) + +dnl CURL_CHECK_WIN32_LARGEFILE +dnl ------------------------------------------------- +dnl Check if curl's WIN32 large file will be used + +AC_DEFUN([CURL_CHECK_WIN32_LARGEFILE], [ + AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl + AC_MSG_CHECKING([whether build target supports WIN32 file API]) + curl_win32_file_api="no" + if test "$curl_cv_header_windows_h" = "yes"; then + if test x"$enable_largefile" != "xno"; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ +#if !defined(_WIN32_WCE) && \ + (defined(__MINGW32__) || \ + (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)))) + int dummy=1; +#else + WIN32 large file API not supported. +#endif + ]]) + ],[ + curl_win32_file_api="win32_large_files" + ]) + fi + if test "$curl_win32_file_api" = "no"; then + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ +#if defined(_WIN32_WCE) || defined(__MINGW32__) || defined(_MSC_VER) + int dummy=1; +#else + WIN32 small file API not supported. +#endif + ]]) + ],[ + curl_win32_file_api="win32_small_files" + ]) + fi + fi + case "$curl_win32_file_api" in + win32_large_files) + AC_MSG_RESULT([yes (large file enabled)]) + AC_DEFINE_UNQUOTED(USE_WIN32_LARGE_FILES, 1, + [Define to 1 if you are building a Windows target with large file support.]) + ;; + win32_small_files) + AC_MSG_RESULT([yes (large file disabled)]) + AC_DEFINE_UNQUOTED(USE_WIN32_SMALL_FILES, 1, + [Define to 1 if you are building a Windows target without large file support.]) + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +]) + +dnl CURL_EXPORT_PCDIR ($pcdir) +dnl ------------------------ +dnl if $pcdir is not empty, set PKG_CONFIG_LIBDIR to $pcdir and export +dnl +dnl we need this macro since pkg-config distinguishes among empty and unset +dnl variable while checking PKG_CONFIG_LIBDIR +dnl + +AC_DEFUN([CURL_EXPORT_PCDIR], [ + if test -n "$1"; then + PKG_CONFIG_LIBDIR="$1" + export PKG_CONFIG_LIBDIR + fi +]) + +dnl CURL_CHECK_PKGCONFIG ($module, [$pcdir]) +dnl ------------------------ +dnl search for the pkg-config tool. Set the PKGCONFIG variable to hold the +dnl path to it, or 'no' if not found/present. +dnl +dnl If pkg-config is present, check that it has info about the $module or +dnl return "no" anyway! +dnl +dnl Optionally PKG_CONFIG_LIBDIR may be given as $pcdir. +dnl + +AC_DEFUN([CURL_CHECK_PKGCONFIG], [ + if test -n "$PKG_CONFIG"; then + PKGCONFIG="$PKG_CONFIG" + else + AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no], + [$PATH:/usr/bin:/usr/local/bin]) + fi + + if test "x$PKGCONFIG" != "xno"; then + AC_MSG_CHECKING([for $1 options with pkg-config]) + dnl ask pkg-config about $1 + itexists=`CURL_EXPORT_PCDIR([$2]) dnl + $PKGCONFIG --exists $1 >/dev/null 2>&1 && echo 1` + + if test -z "$itexists"; then + dnl pkg-config does not have info about the given module! set the + dnl variable to 'no' + PKGCONFIG="no" + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([found]) + fi + fi +]) + + +dnl CURL_GENERATE_CONFIGUREHELP_PM +dnl ------------------------------------------------- +dnl Generate test harness configurehelp.pm module, defining and +dnl initializing some perl variables with values which are known +dnl when the configure script runs. For portability reasons, test +dnl harness needs information on how to run the C preprocessor. + +AC_DEFUN([CURL_GENERATE_CONFIGUREHELP_PM], [ + AC_REQUIRE([AC_PROG_CPP])dnl + tmp_cpp=`eval echo "$ac_cpp" 2>/dev/null` + if test -z "$tmp_cpp"; then + tmp_cpp='cpp' + fi + cat >./tests/configurehelp.pm <<_EOF +[@%:@] This is a generated file. Do not edit. + +package configurehelp; + +use strict; +use warnings; +use Exporter; + +use vars qw( + @ISA + @EXPORT_OK + \$Cpreprocessor + ); + +@ISA = qw(Exporter); + +@EXPORT_OK = qw( + \$Cpreprocessor + ); + +\$Cpreprocessor = '$tmp_cpp'; + +1; +_EOF +]) + +dnl CURL_CPP_P +dnl +dnl Check if $cpp -P should be used for extract define values due to gcc 5 +dnl splitting up strings and defines between line outputs. gcc by default +dnl (without -P) will show TEST EINVAL TEST as +dnl +dnl # 13 "conftest.c" +dnl TEST +dnl # 13 "conftest.c" 3 4 +dnl 22 +dnl # 13 "conftest.c" +dnl TEST + +AC_DEFUN([CURL_CPP_P], [ + AC_MSG_CHECKING([if cpp -P is needed]) + AC_EGREP_CPP([TEST.*TEST], [ + #include +TEST EINVAL TEST + ], [cpp=no], [cpp=yes]) + AC_MSG_RESULT([$cpp]) + + dnl we need cpp -P so check if it works then + if test "x$cpp" = "xyes"; then + AC_MSG_CHECKING([if cpp -P works]) + OLDCPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -P" + AC_EGREP_CPP([TEST.*TEST], [ + #include +TEST EINVAL TEST + ], [cpp_p=yes], [cpp_p=no]) + AC_MSG_RESULT([$cpp_p]) + + if test "x$cpp_p" = "xno"; then + AC_MSG_WARN([failed to figure out cpp -P alternative]) + # without -P + CPPPFLAG="" + else + # with -P + CPPPFLAG="-P" + fi + dnl restore CPPFLAGS + CPPFLAGS=$OLDCPPFLAGS + else + # without -P + CPPPFLAG="" + fi +]) + + +dnl CURL_MAC_CFLAGS +dnl +dnl Check if -mmacosx-version-min, -miphoneos-version-min or any +dnl similar are set manually, otherwise do. And set +dnl -Werror=partial-availability. +dnl + +AC_DEFUN([CURL_MAC_CFLAGS], [ + + tst_cflags="no" + case $host_os in + darwin*) + tst_cflags="yes" + ;; + esac + + AC_MSG_CHECKING([for good-to-use Mac CFLAGS]) + AC_MSG_RESULT([$tst_cflags]); + + if test "$tst_cflags" = "yes"; then + AC_MSG_CHECKING([for *version-min in CFLAGS]) + min="" + if test -z "$(echo $CFLAGS | grep m.*os.*-version-min)"; then + min="-mmacosx-version-min=10.8" + CFLAGS="$CFLAGS $min" + fi + if test -z "$min"; then + AC_MSG_RESULT([set by user]) + else + AC_MSG_RESULT([$min set]) + fi + + old_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -Werror=partial-availability" + AC_MSG_CHECKING([whether $CC accepts -Werror=partial-availability]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + CFLAGS=$old_CFLAGS]) + fi + +]) + + +dnl CURL_SUPPORTS_BUILTIN_AVAILABLE +dnl +dnl Check to see if the compiler supports __builtin_available. This built-in +dnl compiler function first appeared in Apple LLVM 9.0.0. It's so new that, at +dnl the time this macro was written, the function was not yet documented. Its +dnl purpose is to return true if the code is running under a certain OS version +dnl or later. + +AC_DEFUN([CURL_SUPPORTS_BUILTIN_AVAILABLE], [ + AC_MSG_CHECKING([to see if the compiler supports __builtin_available()]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + if (__builtin_available(macOS 10.8, iOS 5.0, *)) {} + ]]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_BUILTIN_AVAILABLE, 1, + [Define to 1 if you have the __builtin_available function.]) + ],[ + AC_MSG_RESULT([no]) + ]) +]) diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..25361a0b64 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,218 @@ +version: 7.50.0.{build} + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 9 2008" + PRJ_CFG: Release + OPENSSL: OFF + WINSSL: ON + HTTP_ONLY: OFF + TESTING: OFF + SHARED: ON + DISABLED_TESTS: "" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2019" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 16 2019" + TARGET: "-A x64" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: ON + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2019" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 16 2019" + TARGET: "-A x64" + PRJ_CFG: Release + OPENSSL: ON + WINSSL: OFF + HTTP_ONLY: OFF + TESTING: OFF + SHARED: ON + DISABLED_TESTS: "" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 10 2010 Win64" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: OFF + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2019" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 16 2019" + TARGET: "-A x64" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: OFF + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2019" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 16 2019" + TARGET: "-A x64" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: OFF + HTTP_ONLY: ON + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: CMake + PRJ_GEN: "MSYS Makefiles" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: OFF + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin" + MSYS2_ARG_CONV_EXCL: "/*" + BUILD_OPT: -k + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: CMake + PRJ_GEN: "MSYS Makefiles" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: ON + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "C:\\mingw-w64\\i686-6.3.0-posix-dwarf-rt_v5-rev1\\mingw32\\bin" + MSYS2_ARG_CONV_EXCL: "/*" + BUILD_OPT: -k + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: CMake + PRJ_GEN: "MSYS Makefiles" + PRJ_CFG: Debug + OPENSSL: OFF + WINSSL: OFF + HTTP_ONLY: OFF + TESTING: ON + SHARED: OFF + DISABLED_TESTS: "!1139" + COMPILER_PATH: "C:\\MinGW\\bin" + MSYS2_ARG_CONV_EXCL: "/*" + BUILD_OPT: -k + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: winbuild_vs2015 + DEBUG: yes + PATHPART: debug + TESTING: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: winbuild_vs2015 + DEBUG: no + PATHPART: release + TESTING: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" + BUILD_SYSTEM: winbuild_vs2017 + DEBUG: yes + PATHPART: debug + TESTING: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" + BUILD_SYSTEM: winbuild_vs2017 + DEBUG: no + PATHPART: release + TESTING: OFF + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017" + BUILD_SYSTEM: VisualStudioSolution + PRJ_CFG: "DLL Debug - DLL Windows SSPI - DLL WinIDN" + TESTING: OFF + VC_VERSION: VC15 + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2019" + BUILD_SYSTEM: CMake + PRJ_GEN: "Visual Studio 16 2019" + TARGET: "-A ARM64" + PRJ_CFG: Release + OPENSSL: OFF + WINSSL: ON + HTTP_ONLY: OFF + TESTING: OFF + SHARED: OFF + DISABLED_TESTS: "" + COMPILER_PATH: "" + - APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015" + BUILD_SYSTEM: autotools + TESTING: ON + DISABLED_TESTS: "!19 !1056 !1233 !1242 !1243 !2002 !2003" + CONFIG_ARGS: "--enable-debug --enable-werror --enable-alt-svc --disable-threaded-resolver --disable-proxy" + +install: + - set "PATH=C:\msys64\usr\bin;%PATH%" + - if not "%COMPILER_PATH%"=="" ( + set "PATH=%COMPILER_PATH%;%PATH%" ) + +build_script: + - if %BUILD_SYSTEM%==CMake ( + cmake . + -G"%PRJ_GEN%" + %TARGET% + -DCMAKE_USE_OPENSSL=%OPENSSL% + -DCMAKE_USE_WINSSL=%WINSSL% + -DHTTP_ONLY=%HTTP_ONLY% + -DBUILD_SHARED_LIBS=%SHARED% + -DBUILD_TESTING=%TESTING% + -DCURL_WERROR=ON + -DENABLE_DEBUG=ON + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE="" + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG="" + -DCMAKE_INSTALL_PREFIX="C:/CURL" + -DCMAKE_BUILD_TYPE=%PRJ_CFG% && + cmake --build . --config %PRJ_CFG% --parallel 2 --clean-first -- %BUILD_OPT% + ) else ( + if %BUILD_SYSTEM%==VisualStudioSolution ( + cd projects && + .\\generate.bat %VC_VERSION% && + msbuild.exe /p:Configuration="%PRJ_CFG%" "Windows\\%VC_VERSION%\\curl-all.sln" + ) else ( + if %BUILD_SYSTEM%==winbuild_vs2015 ( + call buildconf.bat && + cd winbuild && + call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 && + call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 && + nmake /f Makefile.vc mode=dll VC=14 "SSL_PATH=C:\OpenSSL-v111-Win64" WITH_SSL=dll MACHINE=x64 DEBUG=%DEBUG% && + ..\builds\libcurl-vc14-x64-%PATHPART%-dll-ssl-dll-ipv6-sspi\bin\curl.exe -V + ) else ( + if %BUILD_SYSTEM%==winbuild_vs2017 ( + call buildconf.bat && + cd winbuild && + call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" && + nmake /f Makefile.vc mode=dll VC=15 "SSL_PATH=C:\OpenSSL-v111-Win64" WITH_SSL=dll MACHINE=x64 DEBUG=%DEBUG% && + ..\builds\libcurl-vc15-x64-%PATHPART%-dll-ssl-dll-ipv6-sspi\bin\curl.exe -V + ) else ( + if %BUILD_SYSTEM%==autotools ( + bash.exe -e -l -c "cd /c/projects/curl && ./buildconf && ./configure %CONFIG_ARGS% && make && make examples && cd tests && make" + ))))) + +test_script: + - if %TESTING%==ON ( + bash.exe -e -l -c "cd /c/projects/curl/tests && ./runtests.pl -a -p !flaky %DISABLED_TESTS%" ) + +# whitelist branches to avoid testing feature branches twice (as branch and as pull request) +branches: + only: + - master + - /\/ci$/ + +artifacts: + - path: '**/curl.exe' + name: curl + - path: '**/libcurl.dll' + name: libcurl diff --git a/buildconf b/buildconf new file mode 100755 index 0000000000..5095753129 --- /dev/null +++ b/buildconf @@ -0,0 +1,448 @@ +#!/bin/sh +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +########################################################################### + +#-------------------------------------------------------------------------- +# die prints argument string to stdout and exits this shell script. +# +die(){ + echo "buildconf: $@" + exit 1 +} + +#-------------------------------------------------------------------------- +# findtool works as 'which' but we use a different name to make it more +# obvious we aren't using 'which'! ;-) +# Unlike 'which' does, the current directory is ignored. +# +findtool(){ + file="$1" + + if { echo "$file" | grep "/" >/dev/null 2>&1; } then + # when file is given with a path check it first + if test -f "$file"; then + echo "$file" + return + fi + fi + + old_IFS=$IFS; IFS=':' + for path in $PATH + do + IFS=$old_IFS + # echo "checks for $file in $path" >&2 + if test "$path" -a "$path" != '.' -a -f "$path/$file"; then + echo "$path/$file" + return + fi + done + IFS=$old_IFS +} + +#-------------------------------------------------------------------------- +# removethis() removes all files and subdirectories with the given name, +# inside and below the current subdirectory at invocation time. +# +removethis(){ + if test "$#" = "1"; then + find . -depth -name $1 -print > buildconf.tmp.$$ + while read fdname + do + if test -f "$fdname"; then + rm -f "$fdname" + elif test -d "$fdname"; then + rm -f -r "$fdname" + fi + done < buildconf.tmp.$$ + rm -f buildconf.tmp.$$ + fi +} + +#-------------------------------------------------------------------------- +# Ensure that buildconf runs from the subdirectory where configure.ac lives +# +if test ! -f configure.ac || + test ! -f src/tool_main.c || + test ! -f lib/urldata.h || + test ! -f include/curl/curl.h || + test ! -f m4/curl-functions.m4; then + echo "Can not run buildconf from outside of curl's source subdirectory!" + echo "Change to the subdirectory where buildconf is found, and try again." + exit 1 +fi + +#-------------------------------------------------------------------------- +# autoconf 2.57 or newer. Unpatched version 2.67 does not generate proper +# configure script. Unpatched version 2.68 is simply unusable, we should +# disallow 2.68 usage. +# +need_autoconf="2.57" +ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` +if test -z "$ac_version"; then + echo "buildconf: autoconf not found." + echo " You need autoconf version $need_autoconf or newer installed." + exit 1 +fi +old_IFS=$IFS; IFS='.'; set $ac_version; IFS=$old_IFS +if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then + echo "buildconf: autoconf version $ac_version found." + echo " You need autoconf version $need_autoconf or newer installed." + echo " If you have a sufficient autoconf installed, but it" + echo " is not named 'autoconf', then try setting the" + echo " AUTOCONF environment variable." + exit 1 +fi + +if test "$1" = "2" -a "$2" -eq "67"; then + echo "buildconf: autoconf version $ac_version (BAD)" + echo " Unpatched version generates broken configure script." +elif test "$1" = "2" -a "$2" -eq "68"; then + echo "buildconf: autoconf version $ac_version (BAD)" + echo " Unpatched version generates unusable configure script." +else + echo "buildconf: autoconf version $ac_version (ok)" +fi + +am4te_version=`${AUTOM4TE:-autom4te} --version 2>/dev/null|head -n 1| sed -e 's/autom4te\(.*\)/\1/' -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` +if test -z "$am4te_version"; then + echo "buildconf: autom4te not found. Weird autoconf installation!" + exit 1 +fi +if test "$am4te_version" = "$ac_version"; then + echo "buildconf: autom4te version $am4te_version (ok)" +else + echo "buildconf: autom4te version $am4te_version (ERROR: does not match autoconf version)" + exit 1 +fi + +#-------------------------------------------------------------------------- +# autoheader 2.50 or newer +# +ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` +if test -z "$ah_version"; then + echo "buildconf: autoheader not found." + echo " You need autoheader version 2.50 or newer installed." + exit 1 +fi +old_IFS=$IFS; IFS='.'; set $ah_version; IFS=$old_IFS +if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then + echo "buildconf: autoheader version $ah_version found." + echo " You need autoheader version 2.50 or newer installed." + echo " If you have a sufficient autoheader installed, but it" + echo " is not named 'autoheader', then try setting the" + echo " AUTOHEADER environment variable." + exit 1 +fi + +echo "buildconf: autoheader version $ah_version (ok)" + +#-------------------------------------------------------------------------- +# automake 1.7 or newer +# +need_automake="1.7" +am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` +if test -z "$am_version"; then + echo "buildconf: automake not found." + echo " You need automake version $need_automake or newer installed." + exit 1 +fi +old_IFS=$IFS; IFS='.'; set $am_version; IFS=$old_IFS +if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then + echo "buildconf: automake version $am_version found." + echo " You need automake version $need_automake or newer installed." + echo " If you have a sufficient automake installed, but it" + echo " is not named 'automake', then try setting the" + echo " AUTOMAKE environment variable." + exit 1 +fi + +echo "buildconf: automake version $am_version (ok)" + +acloc_version=`${ACLOCAL:-aclocal} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` +if test -z "$acloc_version"; then + echo "buildconf: aclocal not found. Weird automake installation!" + exit 1 +fi +if test "$acloc_version" = "$am_version"; then + echo "buildconf: aclocal version $acloc_version (ok)" +else + echo "buildconf: aclocal version $acloc_version (ERROR: does not match automake version)" + exit 1 +fi + +#-------------------------------------------------------------------------- +# GNU libtoolize preliminary check +# +want_lt_major=1 +want_lt_minor=4 +want_lt_patch=2 +want_lt_version=1.4.2 + +# This approach that tries 'glibtoolize' first is intended for systems that +# have GNU libtool named as 'glibtoolize' and libtoolize not being GNU's. + +libtoolize=`findtool glibtoolize 2>/dev/null` +if test ! -x "$libtoolize"; then + libtoolize=`findtool ${LIBTOOLIZE:-libtoolize}` +fi +if test -z "$libtoolize"; then + echo "buildconf: libtoolize not found." + echo " You need GNU libtoolize $want_lt_version or newer installed." + exit 1 +fi + +lt_pver=`$libtoolize --version 2>/dev/null|head -n 1` +lt_qver=`echo $lt_pver|sed -e "s/([^)]*)//g" -e "s/^[^0-9]*//g"` +lt_version=`echo $lt_qver|sed -e "s/[- ].*//" -e "s/\([a-z]*\)$//"` +if test -z "$lt_version"; then + echo "buildconf: libtoolize not found." + echo " You need GNU libtoolize $want_lt_version or newer installed." + exit 1 +fi +old_IFS=$IFS; IFS='.'; set $lt_version; IFS=$old_IFS +lt_major=$1 +lt_minor=$2 +lt_patch=$3 + +if test -z "$lt_major"; then + lt_status="bad" +elif test "$lt_major" -gt "$want_lt_major"; then + lt_status="good" +elif test "$lt_major" -lt "$want_lt_major"; then + lt_status="bad" +elif test -z "$lt_minor"; then + lt_status="bad" +elif test "$lt_minor" -gt "$want_lt_minor"; then + lt_status="good" +elif test "$lt_minor" -lt "$want_lt_minor"; then + lt_status="bad" +elif test -z "$lt_patch"; then + lt_status="bad" +elif test "$lt_patch" -gt "$want_lt_patch"; then + lt_status="good" +elif test "$lt_patch" -lt "$want_lt_patch"; then + lt_status="bad" +else + lt_status="good" +fi +if test "$lt_status" != "good"; then + echo "buildconf: libtoolize version $lt_version found." + echo " You need GNU libtoolize $want_lt_version or newer installed." + exit 1 +fi + +echo "buildconf: libtoolize version $lt_version (ok)" + +#-------------------------------------------------------------------------- +# m4 check +# +m4=`(${M4:-m4} --version 0<&- || ${M4:-gm4} --version) 2>/dev/null 0<&- | head -n 1`; +m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'` + +if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then + echo "buildconf: GNU m4 version $m4_version (ok)" +else + if test -z "$m4"; then + echo "buildconf: m4 version not recognized. You need a GNU m4 installed!" + else + echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!" + fi + exit 1 +fi + +#-------------------------------------------------------------------------- +# perl check +# +PERL=`findtool ${PERL:-perl}` +if test -z "$PERL"; then + echo "buildconf: perl not found" + exit 1 +fi + +#-------------------------------------------------------------------------- +# Remove files generated on previous buildconf/configure run. +# +for fname in .deps \ + .libs \ + *.la \ + *.lo \ + *.a \ + *.o \ + Makefile \ + Makefile.in \ + aclocal.m4 \ + aclocal.m4.bak \ + ares_build.h \ + ares_config.h \ + ares_config.h.in \ + autom4te.cache \ + compile \ + config.guess \ + curl_config.h \ + curl_config.h.in \ + config.log \ + config.lt \ + config.status \ + config.sub \ + configure \ + configurehelp.pm \ + curl-config \ + depcomp \ + libcares.pc \ + libcurl.pc \ + libtool \ + libtool.m4 \ + libtool.m4.tmp \ + ltmain.sh \ + ltoptions.m4 \ + ltsugar.m4 \ + ltversion.m4 \ + lt~obsolete.m4 \ + missing \ + install-sh \ + stamp-h1 \ + stamp-h2 \ + stamp-h3 ; do + removethis "$fname" +done + +#-------------------------------------------------------------------------- +# run the correct scripts now +# + +echo "buildconf: running libtoolize" +${libtoolize} --copy --force || die "libtoolize command failed" + +# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4 +# subdirectory and this local copy is patched to fix some warnings that +# are triggered when running aclocal and using autoconf 2.62 or later. + +if test "$lt_major" = "1" && test "$lt_minor" = "5"; then + if test -z "$lt_patch" || test "$lt_patch" -lt "26"; then + echo "buildconf: copying libtool.m4 to local m4 subdir" + ac_dir=`${ACLOCAL:-aclocal} --print-ac-dir` + if test -f $ac_dir/libtool.m4; then + cp -f $ac_dir/libtool.m4 m4/libtool.m4 + else + echo "buildconf: $ac_dir/libtool.m4 not found" + fi + if test -f m4/libtool.m4; then + echo "buildconf: renaming some variables in local m4/libtool.m4" + $PERL -i.tmp -pe \ + 's/lt_prog_compiler_pic_works/lt_cv_prog_compiler_pic_works/g; \ + s/lt_prog_compiler_static_works/lt_cv_prog_compiler_static_works/g;' \ + m4/libtool.m4 + rm -f m4/libtool.m4.tmp + fi + fi +fi + +if test -f m4/libtool.m4; then + echo "buildconf: converting all mv to mv -f in local m4/libtool.m4" + $PERL -i.tmp -pe 's/\bmv +([^-\s])/mv -f $1/g' m4/libtool.m4 + rm -f m4/libtool.m4.tmp +fi + +echo "buildconf: running aclocal" +${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS || die "aclocal command failed" + +echo "buildconf: converting all mv to mv -f in local aclocal.m4" +$PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 + +echo "buildconf: running autoheader" +${AUTOHEADER:-autoheader} || die "autoheader command failed" + +echo "buildconf: running autoconf" +${AUTOCONF:-autoconf} || die "autoconf command failed" + +if test -d ares; then + cd ares + echo "buildconf: running in ares" + ./buildconf + cd .. +fi + +echo "buildconf: running automake" +${AUTOMAKE:-automake} --add-missing --copy || die "automake command failed" + +#-------------------------------------------------------------------------- +# GNU libtool complementary check +# +# Depending on the libtool and automake versions being used, config.guess +# might not be installed in the subdirectory until automake has finished. +# So we can not attempt to use it until this very last buildconf stage. +# +if test ! -f ./config.guess; then + echo "buildconf: config.guess not found" +else + buildhost=`./config.guess 2>/dev/null|head -n 1` + case $buildhost in + *-*-darwin*) + need_lt_major=1 + need_lt_minor=5 + need_lt_patch=26 + need_lt_check="yes" + ;; + *-*-hpux*) + need_lt_major=1 + need_lt_minor=5 + need_lt_patch=24 + need_lt_check="yes" + ;; + esac + if test ! -z "$need_lt_check"; then + if test -z "$lt_major"; then + lt_status="bad" + elif test "$lt_major" -gt "$need_lt_major"; then + lt_status="good" + elif test "$lt_major" -lt "$need_lt_major"; then + lt_status="bad" + elif test -z "$lt_minor"; then + lt_status="bad" + elif test "$lt_minor" -gt "$need_lt_minor"; then + lt_status="good" + elif test "$lt_minor" -lt "$need_lt_minor"; then + lt_status="bad" + elif test -z "$lt_patch"; then + lt_status="bad" + elif test "$lt_patch" -gt "$need_lt_patch"; then + lt_status="good" + elif test "$lt_patch" -lt "$need_lt_patch"; then + lt_status="bad" + else + lt_status="good" + fi + if test "$lt_status" != "good"; then + need_lt_version="$need_lt_major.$need_lt_minor.$need_lt_patch" + echo "buildconf: libtool version $lt_version found." + echo " $buildhost requires GNU libtool $need_lt_version or newer installed." + rm -f configure + exit 1 + fi + fi +fi + +#-------------------------------------------------------------------------- +# Finished successfully. +# +echo "buildconf: OK" +exit 0 diff --git a/buildconf.bat b/buildconf.bat new file mode 100644 index 0000000000..0435233151 --- /dev/null +++ b/buildconf.bat @@ -0,0 +1,317 @@ +@echo off +rem *************************************************************************** +rem * _ _ ____ _ +rem * Project ___| | | | _ \| | +rem * / __| | | | |_) | | +rem * | (__| |_| | _ <| |___ +rem * \___|\___/|_| \_\_____| +rem * +rem * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. +rem * +rem * This software is licensed as described in the file COPYING, which +rem * you should have received as part of this distribution. The terms +rem * are also available at https://curl.haxx.se/docs/copyright.html. +rem * +rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell +rem * copies of the Software, and permit persons to whom the Software is +rem * furnished to do so, under the terms of the COPYING file. +rem * +rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +rem * KIND, either express or implied. +rem * +rem *************************************************************************** + +rem NOTES +rem +rem This batch file must be used to set up a git tree to build on systems where +rem there is no autotools support (i.e. DOS and Windows). +rem + +:begin + rem Set our variables + if "%OS%" == "Windows_NT" setlocal + set MODE=GENERATE + + rem Switch to this batch file's directory + cd /d "%~0\.." 1>NUL 2>&1 + + rem Check we are running from a curl git repository + if not exist GIT-INFO goto norepo + + rem Detect programs. HAVE_ + rem When not found the variable is set undefined. The undefined pattern + rem allows for statements like "if not defined HAVE_PERL (command)" + groff --version NUL 2>&1 + if errorlevel 1 (set HAVE_GROFF=) else (set HAVE_GROFF=Y) + nroff --version NUL 2>&1 + if errorlevel 1 (set HAVE_NROFF=) else (set HAVE_NROFF=Y) + perl --version NUL 2>&1 + if errorlevel 1 (set HAVE_PERL=) else (set HAVE_PERL=Y) + gzip --version NUL 2>&1 + if errorlevel 1 (set HAVE_GZIP=) else (set HAVE_GZIP=Y) + +:parseArgs + if "%~1" == "" goto start + + if /i "%~1" == "-clean" ( + set MODE=CLEAN + ) else if /i "%~1" == "-?" ( + goto syntax + ) else if /i "%~1" == "-h" ( + goto syntax + ) else if /i "%~1" == "-help" ( + goto syntax + ) else ( + goto unknown + ) + + shift & goto parseArgs + +:start + if "%MODE%" == "GENERATE" ( + echo. + echo Generating prerequisite files + + call :generate + if errorlevel 3 goto nogenhugehelp + if errorlevel 2 goto nogenmakefile + if errorlevel 1 goto warning + + ) else ( + echo. + echo Removing prerequisite files + + call :clean + if errorlevel 2 goto nocleanhugehelp + if errorlevel 1 goto nocleanmakefile + ) + + goto success + +rem Main generate function. +rem +rem Returns: +rem +rem 0 - success +rem 1 - success with simplified tool_hugehelp.c +rem 2 - failed to generate Makefile +rem 3 - failed to generate tool_hugehelp.c +rem +:generate + if "%OS%" == "Windows_NT" setlocal + set BASIC_HUGEHELP=0 + + rem Create Makefile + echo * %CD%\Makefile + if exist Makefile.dist ( + copy /Y Makefile.dist Makefile 1>NUL 2>&1 + if errorlevel 1 ( + if "%OS%" == "Windows_NT" endlocal + exit /B 2 + ) + ) + + rem Create tool_hugehelp.c + echo * %CD%\src\tool_hugehelp.c + call :genHugeHelp + if errorlevel 2 ( + if "%OS%" == "Windows_NT" endlocal + exit /B 3 + ) + if errorlevel 1 ( + set BASIC_HUGEHELP=1 + ) + cmd /c exit 0 + + rem Setup c-ares git tree + if exist ares\buildconf.bat ( + echo. + echo Configuring c-ares build environment + cd ares + call buildconf.bat + cd .. + ) + + if "%BASIC_HUGEHELP%" == "1" ( + if "%OS%" == "Windows_NT" endlocal + exit /B 1 + ) + + if "%OS%" == "Windows_NT" endlocal + exit /B 0 + +rem Main clean function. +rem +rem Returns: +rem +rem 0 - success +rem 1 - failed to clean Makefile +rem 2 - failed to clean tool_hugehelp.c +rem +:clean + rem Remove Makefile + echo * %CD%\Makefile + if exist Makefile ( + del Makefile 2>NUL + if exist Makefile ( + exit /B 1 + ) + ) + + rem Remove tool_hugehelp.c + echo * %CD%\src\tool_hugehelp.c + if exist src\tool_hugehelp.c ( + del src\tool_hugehelp.c 2>NUL + if exist src\tool_hugehelp.c ( + exit /B 2 + ) + ) + + exit /B + +rem Function to generate src\tool_hugehelp.c +rem +rem Returns: +rem +rem 0 - full tool_hugehelp.c generated +rem 1 - simplified tool_hugehelp.c +rem 2 - failure +rem +:genHugeHelp + if "%OS%" == "Windows_NT" setlocal + set LC_ALL=C + set ROFFCMD= + set BASIC=1 + + if defined HAVE_PERL ( + if defined HAVE_GROFF ( + set ROFFCMD=groff -mtty-char -Tascii -P-c -man + ) else if defined HAVE_NROFF ( + set ROFFCMD=nroff -c -Tascii -man + ) + ) + + if defined ROFFCMD ( + echo #include "tool_setup.h"> src\tool_hugehelp.c + echo #include "tool_hugehelp.h">> src\tool_hugehelp.c + + if defined HAVE_GZIP ( + echo #ifndef HAVE_LIBZ>> src\tool_hugehelp.c + ) + + %ROFFCMD% docs\curl.1 2>NUL | perl src\mkhelp.pl docs\MANUAL >> src\tool_hugehelp.c + if defined HAVE_GZIP ( + echo #else>> src\tool_hugehelp.c + %ROFFCMD% docs\curl.1 2>NUL | perl src\mkhelp.pl -c docs\MANUAL >> src\tool_hugehelp.c + echo #endif /^* HAVE_LIBZ ^*/>> src\tool_hugehelp.c + ) + + set BASIC=0 + ) else ( + if exist src\tool_hugehelp.c.cvs ( + copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c 1>NUL 2>&1 + ) else ( + echo #include "tool_setup.h"> src\tool_hugehelp.c + echo #include "tool_hugehelp.h">> src\tool_hugehelp.c + echo.>> src\tool_hugehelp.c + echo void hugehelp(void^)>> src\tool_hugehelp.c + echo {>> src\tool_hugehelp.c + echo #ifdef USE_MANUAL>> src\tool_hugehelp.c + echo fputs("Built-in manual not included\n", stdout^);>> src\tool_hugehelp.c + echo #endif>> src\tool_hugehelp.c + echo }>> src\tool_hugehelp.c + ) + ) + + findstr "/C:void hugehelp(void)" src\tool_hugehelp.c 1>NUL 2>&1 + if errorlevel 1 ( + if "%OS%" == "Windows_NT" endlocal + exit /B 2 + ) + + if "%BASIC%" == "1" ( + if "%OS%" == "Windows_NT" endlocal + exit /B 1 + ) + + if "%OS%" == "Windows_NT" endlocal + exit /B 0 + +rem Function to clean-up local variables under DOS, Windows 3.x and +rem Windows 9x as setlocal isn't available until Windows NT +rem +:dosCleanup + set MODE= + set HAVE_GROFF= + set HAVE_NROFF= + set HAVE_PERL= + set HAVE_GZIP= + set BASIC_HUGEHELP= + set LC_ALL + set ROFFCMD= + set BASIC= + + exit /B + +:syntax + rem Display the help + echo. + echo Usage: buildconf [-clean] + echo. + echo -clean - Removes the files + goto error + +:unknown + echo. + echo Error: Unknown argument '%1' + goto error + +:norepo + echo. + echo Error: This batch file should only be used with a curl git repository + goto error + +:nogenmakefile + echo. + echo Error: Unable to generate Makefile + goto error + +:nogenhugehelp + echo. + echo Error: Unable to generate src\tool_hugehelp.c + goto error + +:nocleanmakefile + echo. + echo Error: Unable to clean Makefile + goto error + +:nocleanhugehelp + echo. + echo Error: Unable to clean src\tool_hugehelp.c + goto error + +:warning + echo. + echo Warning: The curl manual could not be integrated in the source. This means when + echo you build curl the manual will not be available (curl --man^). Integration of + echo the manual is not required and a summary of the options will still be available + echo (curl --help^). To integrate the manual your PATH is required to have + echo groff/nroff, perl and optionally gzip for compression. + goto success + +:error + if "%OS%" == "Windows_NT" ( + endlocal + ) else ( + call :dosCleanup + ) + exit /B 1 + +:success + if "%OS%" == "Windows_NT" ( + endlocal + ) else ( + call :dosCleanup + ) + exit /B 0 diff --git a/configure.ac b/configure.ac new file mode 100755 index 0000000000..e7ad63925e --- /dev/null +++ b/configure.ac @@ -0,0 +1,4918 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +#*************************************************************************** +dnl Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.57) + +dnl We don't know the version number "statically" so we use a dash here +AC_INIT([curl], [-], [a suitable curl mailing list: https://curl.haxx.se/mail/]) + +XC_OVR_ZZ50 +XC_OVR_ZZ60 +CURL_OVERRIDE_AUTOCONF + +dnl configure script copyright +AC_COPYRIGHT([Copyright (c) 1998 - 2020 Daniel Stenberg, +This configure script may be copied, distributed and modified under the +terms of the curl license; see COPYING for more details]) + +AC_CONFIG_SRCDIR([lib/urldata.h]) +AC_CONFIG_HEADERS(lib/curl_config.h) +AC_CONFIG_MACRO_DIR([m4]) +AM_MAINTAINER_MODE +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +CURL_CHECK_OPTION_DEBUG +CURL_CHECK_OPTION_OPTIMIZE +CURL_CHECK_OPTION_WARNINGS +CURL_CHECK_OPTION_WERROR +CURL_CHECK_OPTION_CURLDEBUG +CURL_CHECK_OPTION_SYMBOL_HIDING +CURL_CHECK_OPTION_ARES +CURL_CHECK_OPTION_RT +CURL_CHECK_OPTION_ESNI + +XC_CHECK_PATH_SEPARATOR + +# +# save the configure arguments +# +CONFIGURE_OPTIONS="\"$ac_configure_args\"" +AC_SUBST(CONFIGURE_OPTIONS) + +CURL_CFLAG_EXTRAS="" +if test X"$want_werror" = Xyes; then + CURL_CFLAG_EXTRAS="-Werror" + if test "$compiler_id" = "GNU_C"; then + dnl enable -pedantic-errors for GCC 5 and later, + dnl as before that it was the same as -Werror=pedantic + if test "$compiler_num" -ge "500"; then + CURL_CFLAG_EXTRAS="$CURL_CFLAG_EXTRAS -pedantic-errors" + fi + fi +fi +AC_SUBST(CURL_CFLAG_EXTRAS) + +dnl SED is mandatory for configure process and libtool. +dnl Set it now, allowing it to be changed later. +if test -z "$SED"; then + dnl allow it to be overridden + AC_PATH_PROG([SED], [sed], [not_found], + [$PATH:/usr/bin:/usr/local/bin]) + if test -z "$SED" || test "$SED" = "not_found"; then + AC_MSG_ERROR([sed not found in PATH. Cannot continue without sed.]) + fi +fi +AC_SUBST([SED]) + +dnl GREP is mandatory for configure process and libtool. +dnl Set it now, allowing it to be changed later. +if test -z "$GREP"; then + dnl allow it to be overridden + AC_PATH_PROG([GREP], [grep], [not_found], + [$PATH:/usr/bin:/usr/local/bin]) + if test -z "$GREP" || test "$GREP" = "not_found"; then + AC_MSG_ERROR([grep not found in PATH. Cannot continue without grep.]) + fi +fi +AC_SUBST([GREP]) + +dnl EGREP is mandatory for configure process and libtool. +dnl Set it now, allowing it to be changed later. +if test -z "$EGREP"; then + dnl allow it to be overridden + if echo a | ($GREP -E '(a|b)') >/dev/null 2>&1; then + AC_MSG_CHECKING([for egrep]) + EGREP="$GREP -E" + AC_MSG_RESULT([$EGREP]) + else + AC_PATH_PROG([EGREP], [egrep], [not_found], + [$PATH:/usr/bin:/usr/local/bin]) + fi +fi +if test -z "$EGREP" || test "$EGREP" = "not_found"; then + AC_MSG_ERROR([egrep not found in PATH. Cannot continue without egrep.]) +fi +AC_SUBST([EGREP]) + +dnl AR is mandatory for configure process and libtool. +dnl This is target dependent, so check it as a tool. +if test -z "$AR"; then + dnl allow it to be overridden + AC_PATH_TOOL([AR], [ar], [not_found], + [$PATH:/usr/bin:/usr/local/bin]) + if test -z "$AR" || test "$AR" = "not_found"; then + AC_MSG_ERROR([ar not found in PATH. Cannot continue without ar.]) + fi +fi +AC_SUBST([AR]) + +AC_SUBST(libext) + +dnl figure out the libcurl version +CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)".*/\1/p' ${srcdir}/include/curl/curlver.h` +XC_CHECK_PROG_CC + +dnl for --enable-code-coverage +CURL_COVERAGE + +XC_AUTOMAKE +AC_MSG_CHECKING([curl version]) +AC_MSG_RESULT($CURLVERSION) + +AC_SUBST(CURLVERSION) + +dnl +dnl we extract the numerical version for curl-config only +VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\([0-9A-Fa-f]*\).*/\1/p' ${srcdir}/include/curl/curlver.h` +AC_SUBST(VERSIONNUM) + +dnl Solaris pkgadd support definitions +PKGADD_PKG="HAXXcurl" +PKGADD_NAME="curl - a client that groks URLs" +PKGADD_VENDOR="curl.haxx.se" +AC_SUBST(PKGADD_PKG) +AC_SUBST(PKGADD_NAME) +AC_SUBST(PKGADD_VENDOR) + +dnl +dnl initialize all the info variables + curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl,bearssl} )" + curl_ssh_msg="no (--with-{libssh,libssh2})" + curl_zlib_msg="no (--with-zlib)" + curl_brotli_msg="no (--with-brotli)" + curl_gss_msg="no (--with-gssapi)" +curl_tls_srp_msg="no (--enable-tls-srp)" + curl_res_msg="default (--enable-ares / --enable-threaded-resolver)" + curl_ipv6_msg="no (--enable-ipv6)" +curl_unix_sockets_msg="no (--enable-unix-sockets)" + curl_idn_msg="no (--with-{libidn2,winidn})" + curl_manual_msg="no (--enable-manual)" +curl_libcurl_msg="enabled (--disable-libcurl-option)" +curl_verbose_msg="enabled (--disable-verbose)" + curl_sspi_msg="no (--enable-sspi)" + curl_ldap_msg="no (--enable-ldap / --with-ldap-lib / --with-lber-lib)" + curl_ldaps_msg="no (--enable-ldaps)" + curl_rtsp_msg="no (--enable-rtsp)" + curl_rtmp_msg="no (--with-librtmp)" + curl_mtlnk_msg="no (--with-libmetalink)" + curl_psl_msg="no (--with-libpsl)" + + ssl_backends= + +dnl +dnl Save some initial values the user might have provided +dnl +INITIAL_LDFLAGS=$LDFLAGS +INITIAL_LIBS=$LIBS + +dnl +dnl Detect the canonical host and target build environment +dnl + +AC_CANONICAL_HOST +dnl Get system canonical name +AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS]) + +# Silence warning: ar: 'u' modifier ignored since 'D' is the default +AC_SUBST(AR_FLAGS, [cr]) + +dnl This defines _ALL_SOURCE for AIX +CURL_CHECK_AIX_ALL_SOURCE + +dnl Our configure and build reentrant settings +CURL_CONFIGURE_THREAD_SAFE +CURL_CONFIGURE_REENTRANT + +dnl check for how to do large files +AC_SYS_LARGEFILE + +XC_LIBTOOL + +# +# Automake conditionals based on libtool related checks +# + +AM_CONDITIONAL([CURL_LT_SHLIB_USE_VERSION_INFO], + [test "x$xc_lt_shlib_use_version_info" = 'xyes']) +AM_CONDITIONAL([CURL_LT_SHLIB_USE_NO_UNDEFINED], + [test "x$xc_lt_shlib_use_no_undefined" = 'xyes']) +AM_CONDITIONAL([CURL_LT_SHLIB_USE_MIMPURE_TEXT], + [test "x$xc_lt_shlib_use_mimpure_text" = 'xyes']) + +# +# Due to libtool and automake machinery limitations of not allowing +# specifying separate CPPFLAGS or CFLAGS when compiling objects for +# inclusion of these in shared or static libraries, we are forced to +# build using separate configure runs for shared and static libraries +# on systems where different CPPFLAGS or CFLAGS are mandatory in order +# to compile objects for each kind of library. Notice that relying on +# the '-DPIC' CFLAG that libtool provides is not valid given that the +# user might for example choose to build static libraries with PIC. +# + +# +# Make our Makefile.am files use the staticlib CPPFLAG only when strictly +# targeting a static library and not building its shared counterpart. +# + +AM_CONDITIONAL([USE_CPPFLAG_CURL_STATICLIB], + [test "x$xc_lt_build_static_only" = 'xyes']) + +# +# Make staticlib CPPFLAG variable and its definition visible in output +# files unconditionally, providing an empty definition unless strictly +# targeting a static library and not building its shared counterpart. +# + +CPPFLAG_CURL_STATICLIB= +if test "x$xc_lt_build_static_only" = 'xyes'; then + CPPFLAG_CURL_STATICLIB='-DCURL_STATICLIB' +fi +AC_SUBST([CPPFLAG_CURL_STATICLIB]) + + +# Determine whether all dependent libraries must be specified when linking +if test "X$enable_shared" = "Xyes" -a "X$link_all_deplibs" = "Xno" +then + REQUIRE_LIB_DEPS=no +else + REQUIRE_LIB_DEPS=yes +fi +AC_SUBST(REQUIRE_LIB_DEPS) +AM_CONDITIONAL(USE_EXPLICIT_LIB_DEPS, test x$REQUIRE_LIB_DEPS = xyes) + +dnl check if there's a way to force code inline +AC_C_INLINE + +dnl ********************************************************************** +dnl platform/compiler/architecture specific checks/flags +dnl ********************************************************************** + +CURL_CHECK_COMPILER +CURL_SET_COMPILER_BASIC_OPTS +CURL_SET_COMPILER_DEBUG_OPTS +CURL_SET_COMPILER_OPTIMIZE_OPTS +CURL_SET_COMPILER_WARNING_OPTS + +if test "$compiler_id" = "INTEL_UNIX_C"; then + # + if test "$compiler_num" -ge "1000"; then + dnl icc 10.X or later + CFLAGS="$CFLAGS -shared-intel" + elif test "$compiler_num" -ge "900"; then + dnl icc 9.X specific + CFLAGS="$CFLAGS -i-dynamic" + fi + # +fi + +CURL_CHECK_COMPILER_HALT_ON_ERROR +CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE +CURL_CHECK_COMPILER_PROTOTYPE_MISMATCH +CURL_CHECK_COMPILER_SYMBOL_HIDING + +CURL_CHECK_CURLDEBUG +AM_CONDITIONAL(CURLDEBUG, test x$want_curldebug = xyes) + +supports_unittests=yes +# cross-compilation of unit tests static library/programs fails when +# libcurl shared library is built. This might be due to a libtool or +# automake issue. In this case we disable unit tests. +if test "x$cross_compiling" != "xno" && + test "x$enable_shared" != "xno"; then + supports_unittests=no +fi + +# IRIX 6.5.24 gcc 3.3 autobuilds fail unittests library compilation due to +# a problem related with OpenSSL headers and library versions not matching. +# Disable unit tests while time to further investigate this is found. +case $host in + mips-sgi-irix6.5) + if test "$compiler_id" = "GNU_C"; then + supports_unittests=no + fi + ;; +esac + +# All AIX autobuilds fails unit tests linking against unittests library +# due to unittests library being built with no symbols or members. Libtool ? +# Disable unit tests while time to further investigate this is found. +case $host_os in + aix*) + supports_unittests=no + ;; +esac + +dnl Build unit tests when option --enable-debug is given. +if test "x$want_debug" = "xyes" && + test "x$supports_unittests" = "xyes"; then + want_unittests=yes +else + want_unittests=no +fi +AM_CONDITIONAL(BUILD_UNITTESTS, test x$want_unittests = xyes) + +dnl ********************************************************************** +dnl Compilation based checks should not be done before this point. +dnl ********************************************************************** + +dnl ********************************************************************** +dnl Make sure that our checks for headers windows.h winsock.h winsock2.h +dnl and ws2tcpip.h take precedence over any other further checks which +dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for +dnl this specific header files. And do them before its results are used. +dnl ********************************************************************** + +CURL_CHECK_HEADER_WINDOWS +CURL_CHECK_NATIVE_WINDOWS +case X-"$curl_cv_native_windows" in + X-yes) + CURL_CHECK_HEADER_WINSOCK + CURL_CHECK_HEADER_WINSOCK2 + CURL_CHECK_HEADER_WS2TCPIP + CURL_CHECK_HEADER_WINLDAP + CURL_CHECK_HEADER_WINBER + ;; + *) + curl_cv_header_winsock_h="no" + curl_cv_header_winsock2_h="no" + curl_cv_header_ws2tcpip_h="no" + curl_cv_header_winldap_h="no" + curl_cv_header_winber_h="no" + ;; +esac +CURL_CHECK_WIN32_LARGEFILE + +CURL_MAC_CFLAGS +CURL_SUPPORTS_BUILTIN_AVAILABLE + + +dnl ************************************************************ +dnl switch off particular protocols +dnl +AC_MSG_CHECKING([whether to support http]) +AC_ARG_ENABLE(http, +AC_HELP_STRING([--enable-http],[Enable HTTP support]) +AC_HELP_STRING([--disable-http],[Disable HTTP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP]) + disable_http="yes" + AC_MSG_WARN([disable HTTP disables FTP over proxy and RTSP]) + AC_SUBST(CURL_DISABLE_HTTP, [1]) + AC_DEFINE(CURL_DISABLE_RTSP, 1, [to disable RTSP]) + AC_SUBST(CURL_DISABLE_RTSP, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) +AC_MSG_CHECKING([whether to support ftp]) +AC_ARG_ENABLE(ftp, +AC_HELP_STRING([--enable-ftp],[Enable FTP support]) +AC_HELP_STRING([--disable-ftp],[Disable FTP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_FTP, 1, [to disable FTP]) + AC_SUBST(CURL_DISABLE_FTP, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) +AC_MSG_CHECKING([whether to support file]) +AC_ARG_ENABLE(file, +AC_HELP_STRING([--enable-file],[Enable FILE support]) +AC_HELP_STRING([--disable-file],[Disable FILE support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_FILE, 1, [to disable FILE]) + AC_SUBST(CURL_DISABLE_FILE, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) +AC_MSG_CHECKING([whether to support ldap]) +AC_ARG_ENABLE(ldap, +AC_HELP_STRING([--enable-ldap],[Enable LDAP support]) +AC_HELP_STRING([--disable-ldap],[Disable LDAP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP]) + AC_SUBST(CURL_DISABLE_LDAP, [1]) + ;; + *) + AC_MSG_RESULT(yes) + ;; + esac ],[ + AC_MSG_RESULT(yes) ] +) +AC_MSG_CHECKING([whether to support ldaps]) +AC_ARG_ENABLE(ldaps, +AC_HELP_STRING([--enable-ldaps],[Enable LDAPS support]) +AC_HELP_STRING([--disable-ldaps],[Disable LDAPS support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1]) + ;; + *) if test "x$CURL_DISABLE_LDAP" = "x1" ; then + AC_MSG_RESULT(LDAP needs to be enabled to support LDAPS) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1]) + else + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation]) + AC_SUBST(HAVE_LDAP_SSL, [1]) + fi + ;; + esac ],[ + if test "x$CURL_DISABLE_LDAP" = "x1" ; then + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1]) + else + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation]) + AC_SUBST(HAVE_LDAP_SSL, [1]) + fi ] +) + +AC_MSG_CHECKING([whether to support rtsp]) +AC_ARG_ENABLE(rtsp, +AC_HELP_STRING([--enable-rtsp],[Enable RTSP support]) +AC_HELP_STRING([--disable-rtsp],[Disable RTSP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_RTSP, 1, [to disable RTSP]) + AC_SUBST(CURL_DISABLE_RTSP, [1]) + ;; + *) if test x$CURL_DISABLE_HTTP = x1 ; then + AC_MSG_ERROR(HTTP support needs to be enabled in order to enable RTSP support!) + else + AC_MSG_RESULT(yes) + curl_rtsp_msg="enabled" + fi + ;; + esac ], + if test "x$CURL_DISABLE_HTTP" != "x1"; then + AC_MSG_RESULT(yes) + curl_rtsp_msg="enabled" + else + AC_MSG_RESULT(no) + fi +) + +AC_MSG_CHECKING([whether to support proxies]) +AC_ARG_ENABLE(proxy, +AC_HELP_STRING([--enable-proxy],[Enable proxy support]) +AC_HELP_STRING([--disable-proxy],[Disable proxy support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_PROXY, 1, [to disable proxies]) + AC_SUBST(CURL_DISABLE_PROXY, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +AC_MSG_CHECKING([whether to support dict]) +AC_ARG_ENABLE(dict, +AC_HELP_STRING([--enable-dict],[Enable DICT support]) +AC_HELP_STRING([--disable-dict],[Disable DICT support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT]) + AC_SUBST(CURL_DISABLE_DICT, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) +AC_MSG_CHECKING([whether to support telnet]) +AC_ARG_ENABLE(telnet, +AC_HELP_STRING([--enable-telnet],[Enable TELNET support]) +AC_HELP_STRING([--disable-telnet],[Disable TELNET support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_TELNET, 1, [to disable TELNET]) + AC_SUBST(CURL_DISABLE_TELNET, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) +AC_MSG_CHECKING([whether to support tftp]) +AC_ARG_ENABLE(tftp, +AC_HELP_STRING([--enable-tftp],[Enable TFTP support]) +AC_HELP_STRING([--disable-tftp],[Disable TFTP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_TFTP, 1, [to disable TFTP]) + AC_SUBST(CURL_DISABLE_TFTP, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +AC_MSG_CHECKING([whether to support pop3]) +AC_ARG_ENABLE(pop3, +AC_HELP_STRING([--enable-pop3],[Enable POP3 support]) +AC_HELP_STRING([--disable-pop3],[Disable POP3 support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_POP3, 1, [to disable POP3]) + AC_SUBST(CURL_DISABLE_POP3, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + + +AC_MSG_CHECKING([whether to support imap]) +AC_ARG_ENABLE(imap, +AC_HELP_STRING([--enable-imap],[Enable IMAP support]) +AC_HELP_STRING([--disable-imap],[Disable IMAP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_IMAP, 1, [to disable IMAP]) + AC_SUBST(CURL_DISABLE_IMAP, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + + +AC_MSG_CHECKING([whether to support smb]) +AC_ARG_ENABLE(smb, +AC_HELP_STRING([--enable-smb],[Enable SMB/CIFS support]) +AC_HELP_STRING([--disable-smb],[Disable SMB/CIFS support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_SMB, 1, [to disable SMB/CIFS]) + AC_SUBST(CURL_DISABLE_SMB, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +AC_MSG_CHECKING([whether to support smtp]) +AC_ARG_ENABLE(smtp, +AC_HELP_STRING([--enable-smtp],[Enable SMTP support]) +AC_HELP_STRING([--disable-smtp],[Disable SMTP support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_SMTP, 1, [to disable SMTP]) + AC_SUBST(CURL_DISABLE_SMTP, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +AC_MSG_CHECKING([whether to support gopher]) +AC_ARG_ENABLE(gopher, +AC_HELP_STRING([--enable-gopher],[Enable Gopher support]) +AC_HELP_STRING([--disable-gopher],[Disable Gopher support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable Gopher]) + AC_SUBST(CURL_DISABLE_GOPHER, [1]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + + +dnl ********************************************************************** +dnl Check for built-in manual +dnl ********************************************************************** + +AC_MSG_CHECKING([whether to provide built-in manual]) +AC_ARG_ENABLE(manual, +AC_HELP_STRING([--enable-manual],[Enable built-in manual]) +AC_HELP_STRING([--disable-manual],[Disable built-in manual]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(yes) + USE_MANUAL="1" + ;; + esac ], + AC_MSG_RESULT(yes) + USE_MANUAL="1" +) +dnl The actual use of the USE_MANUAL variable is done much later in this +dnl script to allow other actions to disable it as well. + +dnl ************************************************************ +dnl disable C code generation support +dnl +AC_MSG_CHECKING([whether to enable generation of C code]) +AC_ARG_ENABLE(libcurl_option, +AC_HELP_STRING([--enable-libcurl-option],[Enable --libcurl C code generation support]) +AC_HELP_STRING([--disable-libcurl-option],[Disable --libcurl C code generation support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_LIBCURL_OPTION, 1, [to disable --libcurl C code generation option]) + curl_libcurl_msg="no" + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ********************************************************************** +dnl Checks for libraries. +dnl ********************************************************************** + +AC_MSG_CHECKING([whether to use libgcc]) +AC_ARG_ENABLE(libgcc, +AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), +[ case "$enableval" in + yes) + LIBS="-lgcc $LIBS" + AC_MSG_RESULT(yes) + ;; + *) AC_MSG_RESULT(no) + ;; + esac ], + AC_MSG_RESULT(no) +) + +CURL_CHECK_LIB_XNET + +dnl gethostbyname without lib or in the nsl lib? +AC_CHECK_FUNC(gethostbyname, + [HAVE_GETHOSTBYNAME="1" + ], + [ AC_CHECK_LIB(nsl, gethostbyname, + [HAVE_GETHOSTBYNAME="1" + LIBS="-lnsl $LIBS" + ]) + ]) + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl gethostbyname in the socket lib? + AC_CHECK_LIB(socket, gethostbyname, + [HAVE_GETHOSTBYNAME="1" + LIBS="-lsocket $LIBS" + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl gethostbyname in the watt lib? + AC_CHECK_LIB(watt, gethostbyname, + [HAVE_GETHOSTBYNAME="1" + CPPFLAGS="-I/dev/env/WATT_ROOT/inc" + LDFLAGS="-L/dev/env/WATT_ROOT/lib" + LIBS="-lwatt $LIBS" + ]) +fi + +dnl At least one system has been identified to require BOTH nsl and socket +dnl libs at the same time to link properly. +if test "$HAVE_GETHOSTBYNAME" != "1" +then + AC_MSG_CHECKING([for gethostbyname with both nsl and socket libs]) + my_ac_save_LIBS=$LIBS + LIBS="-lnsl -lsocket $LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + gethostbyname(); + ]]) + ],[ + AC_MSG_RESULT([yes]) + HAVE_GETHOSTBYNAME="1" + ],[ + AC_MSG_RESULT([no]) + LIBS=$my_ac_save_LIBS + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl This is for winsock systems + if test "$curl_cv_header_windows_h" = "yes"; then + if test "$curl_cv_header_winsock_h" = "yes"; then + case $host in + *-*-mingw32ce*) + winsock_LIB="-lwinsock" + ;; + *) + winsock_LIB="-lwsock32" + ;; + esac + fi + if test "$curl_cv_header_winsock2_h" = "yes"; then + winsock_LIB="-lws2_32" + fi + if test ! -z "$winsock_LIB"; then + my_ac_save_LIBS=$LIBS + LIBS="$winsock_LIB $LIBS" + AC_MSG_CHECKING([for gethostbyname in $winsock_LIB]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#else +#ifdef HAVE_WINSOCK_H +#include +#endif +#endif +#endif + ]],[[ + gethostbyname("www.dummysite.com"); + ]]) + ],[ + AC_MSG_RESULT([yes]) + HAVE_GETHOSTBYNAME="1" + ],[ + AC_MSG_RESULT([no]) + winsock_LIB="" + LIBS=$my_ac_save_LIBS + ]) + fi + fi +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl This is for Minix 3.1 + AC_MSG_CHECKING([for gethostbyname for Minix 3]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +/* Older Minix versions may need here instead */ +#include + ]],[[ + gethostbyname("www.dummysite.com"); + ]]) + ],[ + AC_MSG_RESULT([yes]) + HAVE_GETHOSTBYNAME="1" + ],[ + AC_MSG_RESULT([no]) + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl This is for eCos with a stubbed DNS implementation + AC_MSG_CHECKING([for gethostbyname for eCos]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#include +#include + ]],[[ + gethostbyname("www.dummysite.com"); + ]]) + ],[ + AC_MSG_RESULT([yes]) + HAVE_GETHOSTBYNAME="1" + ],[ + AC_MSG_RESULT([no]) + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl This is for AmigaOS with bsdsocket.library - needs testing before -lnet + AC_MSG_CHECKING([for gethostbyname for AmigaOS bsdsocket.library]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#include +struct Library *SocketBase = NULL; + ]],[[ + gethostbyname("www.dummysite.com"); + ]]) + ],[ + AC_MSG_RESULT([yes]) + HAVE_GETHOSTBYNAME="1" + HAVE_PROTO_BSDSOCKET_H="1" + AC_DEFINE(HAVE_PROTO_BSDSOCKET_H, 1, [if Amiga bsdsocket.library is in use]) + AC_SUBST(HAVE_PROTO_BSDSOCKET_H, [1]) + ],[ + AC_MSG_RESULT([no]) + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl gethostbyname in the network lib - for Haiku OS + AC_CHECK_LIB(network, gethostbyname, + [HAVE_GETHOSTBYNAME="1" + LIBS="-lnetwork $LIBS" + ]) +fi + +if test "$HAVE_GETHOSTBYNAME" != "1" +then + dnl gethostbyname in the net lib - for BeOS + AC_CHECK_LIB(net, gethostbyname, + [HAVE_GETHOSTBYNAME="1" + LIBS="-lnet $LIBS" + ]) +fi + + +if test "$HAVE_GETHOSTBYNAME" != "1"; then + AC_MSG_ERROR([couldn't find libraries for gethostbyname()]) +fi + +CURL_CHECK_LIBS_CONNECT + +CURL_NETWORK_LIBS=$LIBS + +dnl ********************************************************************** +dnl In case that function clock_gettime with monotonic timer is available, +dnl check for additional required libraries. +dnl ********************************************************************** +CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC + +dnl ********************************************************************** +dnl The preceding library checks are all potentially useful for test +dnl servers and libtest cases which require networking and clock_gettime +dnl support. Save the list of required libraries at this point for use +dnl while linking those test servers and programs. +dnl ********************************************************************** +CURL_NETWORK_AND_TIME_LIBS=$LIBS + +dnl ********************************************************************** +dnl Check for the presence of ZLIB libraries and headers +dnl ********************************************************************** + +dnl Check for & handle argument to --with-zlib. + +clean_CPPFLAGS=$CPPFLAGS +clean_LDFLAGS=$LDFLAGS +clean_LIBS=$LIBS +ZLIB_LIBS="" +AC_ARG_WITH(zlib, +AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH]) +AC_HELP_STRING([--without-zlib],[disable use of zlib]), + [OPT_ZLIB="$withval"]) + +if test "$OPT_ZLIB" = "no" ; then + AC_MSG_WARN([zlib disabled]) +else + if test "$OPT_ZLIB" = "yes" ; then + OPT_ZLIB="" + fi + + if test -z "$OPT_ZLIB" ; then + CURL_CHECK_PKGCONFIG(zlib) + + if test "$PKGCONFIG" != "no" ; then + LIBS="`$PKGCONFIG --libs-only-l zlib` $LIBS" + LDFLAGS="$LDFLAGS `$PKGCONFIG --libs-only-L zlib`" + CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags-only-I zlib`" + OPT_ZLIB="" + HAVE_LIBZ="1" + fi + + if test -z "$HAVE_LIBZ"; then + + dnl Check for the lib without setting any new path, since many + dnl people have it in the default path + + AC_CHECK_LIB(z, inflateEnd, + dnl libz found, set the variable + [HAVE_LIBZ="1" + LIBS="-lz $LIBS"], + dnl if no lib found, try /usr/local + [OPT_ZLIB="/usr/local"]) + fi + fi + + dnl Add a nonempty path to the compiler flags + if test -n "$OPT_ZLIB"; then + CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include" + LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff" + fi + + AC_CHECK_HEADER(zlib.h, + [ + dnl zlib.h was found + HAVE_ZLIB_H="1" + dnl if the lib wasn't found already, try again with the new paths + if test "$HAVE_LIBZ" != "1"; then + AC_CHECK_LIB(z, gzread, + [ + dnl the lib was found! + HAVE_LIBZ="1" + LIBS="-lz $LIBS" + ], + [ CPPFLAGS=$clean_CPPFLAGS + LDFLAGS=$clean_LDFLAGS]) + fi + ], + [ + dnl zlib.h was not found, restore the flags + CPPFLAGS=$clean_CPPFLAGS + LDFLAGS=$clean_LDFLAGS] + ) + + if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1" + then + AC_MSG_WARN([configure found only the libz lib, not the header file!]) + HAVE_LIBZ="" + CPPFLAGS=$clean_CPPFLAGS + LDFLAGS=$clean_LDFLAGS + LIBS=$clean_LIBS + elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1" + then + AC_MSG_WARN([configure found only the libz header file, not the lib!]) + CPPFLAGS=$clean_CPPFLAGS + LDFLAGS=$clean_LDFLAGS + LIBS=$clean_LIBS + elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1" + then + dnl both header and lib were found! + AC_SUBST(HAVE_LIBZ) + AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) + AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available]) + + ZLIB_LIBS="-lz" + LIBS="-lz $clean_LIBS" + + dnl replace 'HAVE_LIBZ' in the automake makefile.ams + AMFIXLIB="1" + AC_MSG_NOTICE([found both libz and libz.h header]) + curl_zlib_msg="enabled" + fi +fi + +dnl set variable for use in automakefile(s) +AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1) +AC_SUBST(ZLIB_LIBS) + +dnl ********************************************************************** +dnl Check for the presence of BROTLI decoder libraries and headers +dnl ********************************************************************** + +dnl Brotli project home page: https://github.com/google/brotli + +dnl Default to compiler & linker defaults for BROTLI files & libraries. +OPT_BROTLI=off +AC_ARG_WITH(brotli,dnl +AC_HELP_STRING([--with-brotli=PATH],[Where to look for brotli, PATH points to the BROTLI installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--without-brotli], [disable BROTLI]), + OPT_BROTLI=$withval) + +if test X"$OPT_BROTLI" != Xno; then + dnl backup the pre-brotli variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + case "$OPT_BROTLI" in + yes) + dnl --with-brotli (without path) used + CURL_CHECK_PKGCONFIG(libbrotlidec) + + if test "$PKGCONFIG" != "no" ; then + LIB_BROTLI=`$PKGCONFIG --libs-only-l libbrotlidec` + LD_BROTLI=`$PKGCONFIG --libs-only-L libbrotlidec` + CPP_BROTLI=`$PKGCONFIG --cflags-only-I libbrotlidec` + version=`$PKGCONFIG --modversion libbrotlidec` + DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/-L//'` + fi + + ;; + off) + dnl no --with-brotli option given, just check default places + ;; + *) + dnl use the given --with-brotli spot + PREFIX_BROTLI=$OPT_BROTLI + ;; + esac + + dnl if given with a prefix, we set -L and -I based on that + if test -n "$PREFIX_BROTLI"; then + LIB_BROTLI="-lbrotlidec" + LD_BROTLI=-L${PREFIX_BROTLI}/lib$libsuff + CPP_BROTLI=-I${PREFIX_BROTLI}/include + DIR_BROTLI=${PREFIX_BROTLI}/lib$libsuff + fi + + LDFLAGS="$LDFLAGS $LD_BROTLI" + CPPFLAGS="$CPPFLAGS $CPP_BROTLI" + LIBS="$LIB_BROTLI $LIBS" + + AC_CHECK_LIB(brotlidec, BrotliDecoderDecompress) + + AC_CHECK_HEADERS(brotli/decode.h, + curl_brotli_msg="enabled (libbrotlidec)" + HAVE_BROTLI=1 + AC_DEFINE(HAVE_BROTLI, 1, [if BROTLI is in use]) + AC_SUBST(HAVE_BROTLI, [1]) + ) + + if test X"$OPT_BROTLI" != Xoff && + test "$HAVE_BROTLI" != "1"; then + AC_MSG_ERROR([BROTLI libs and/or directories were not found where specified!]) + fi + + if test "$HAVE_BROTLI" = "1"; then + if test -n "$DIR_BROTLI"; then + dnl when the brotli shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH + dnl to prevent further configure tests to fail due to this + + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_BROTLI" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_BROTLI to CURL_LIBRARY_PATH]) + fi + fi + else + dnl no brotli, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + fi +fi + +dnl ********************************************************************** +dnl Check for LDAP +dnl ********************************************************************** + +LDAPLIBNAME="" +AC_ARG_WITH(ldap-lib, +AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of ldap lib file]), + [LDAPLIBNAME="$withval"]) + +LBERLIBNAME="" +AC_ARG_WITH(lber-lib, +AC_HELP_STRING([--with-lber-lib=libname],[Specify name of lber lib file]), + [LBERLIBNAME="$withval"]) + +if test x$CURL_DISABLE_LDAP != x1 ; then + + CURL_CHECK_HEADER_LBER + CURL_CHECK_HEADER_LDAP + CURL_CHECK_HEADER_LDAPSSL + CURL_CHECK_HEADER_LDAP_SSL + + if test -z "$LDAPLIBNAME" ; then + if test "$curl_cv_native_windows" = "yes"; then + dnl Windows uses a single and unique LDAP library name + LDAPLIBNAME="wldap32" + LBERLIBNAME="no" + fi + fi + + if test "$LDAPLIBNAME" ; then + AC_CHECK_LIB("$LDAPLIBNAME", ldap_init,, [ + AC_MSG_WARN(["$LDAPLIBNAME" is not an LDAP library: LDAP disabled]) + AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP]) + AC_SUBST(CURL_DISABLE_LDAP, [1]) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1])]) + else + dnl Try to find the right ldap libraries for this system + CURL_CHECK_LIBS_LDAP + case X-"$curl_cv_ldap_LIBS" in + X-unknown) + AC_MSG_WARN([Cannot find libraries for LDAP support: LDAP disabled]) + AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP]) + AC_SUBST(CURL_DISABLE_LDAP, [1]) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1]) + ;; + esac + fi +fi + +if test x$CURL_DISABLE_LDAP != x1 ; then + + if test "$LBERLIBNAME" ; then + dnl If name is "no" then don't define this library at all + dnl (it's only needed if libldap.so's dependencies are broken). + if test "$LBERLIBNAME" != "no" ; then + AC_CHECK_LIB("$LBERLIBNAME", ber_free,, [ + AC_MSG_WARN(["$LBERLIBNAME" is not an LBER library: LDAP disabled]) + AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP]) + AC_SUBST(CURL_DISABLE_LDAP, [1]) + AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS]) + AC_SUBST(CURL_DISABLE_LDAPS, [1])]) + fi + fi +fi + +if test x$CURL_DISABLE_LDAP != x1 ; then + AC_CHECK_FUNCS([ldap_url_parse ldap_init_fd]) + + if test "$LDAPLIBNAME" = "wldap32"; then + curl_ldap_msg="enabled (winldap)" + AC_DEFINE(USE_WIN32_LDAP, 1, [Use Windows LDAP implementation]) + else + curl_ldap_msg="enabled (OpenLDAP)" + if test "x$ac_cv_func_ldap_init_fd" = "xyes"; then + AC_DEFINE(USE_OPENLDAP, 1, [Use OpenLDAP-specific code]) + AC_SUBST(USE_OPENLDAP, [1]) + fi + fi +fi + +if test x$CURL_DISABLE_LDAPS != x1 ; then + curl_ldaps_msg="enabled" +fi + +dnl ********************************************************************** +dnl Checks for IPv6 +dnl ********************************************************************** + +AC_MSG_CHECKING([whether to enable IPv6]) +AC_ARG_ENABLE(ipv6, +AC_HELP_STRING([--enable-ipv6],[Enable IPv6 (with IPv4) support]) +AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + ipv6=no + ;; + *) AC_MSG_RESULT(yes) + ipv6=yes + ;; + esac ], + + AC_TRY_RUN([ /* are AF_INET6 and sockaddr_in6 available? */ +#include +#ifdef HAVE_WINSOCK2_H +#include +#include +#else +#include +#include +#if defined (__TANDEM) +# include +#endif +#endif +#include /* for exit() */ +main() +{ + struct sockaddr_in6 s; + (void)s; + if (socket(AF_INET6, SOCK_STREAM, 0) < 0) + exit(1); + else + exit(0); +} +], + AC_MSG_RESULT(yes) + ipv6=yes, + AC_MSG_RESULT(no) + ipv6=no, + AC_MSG_RESULT(yes) + ipv6=yes +)) + +if test "$ipv6" = yes; then + curl_ipv6_msg="enabled" + AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support]) + IPV6_ENABLED=1 + AC_SUBST(IPV6_ENABLED) + + AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member]) + AC_TRY_COMPILE([ +#include +#ifdef HAVE_WINSOCK2_H +#include +#include +#else +#include +#if defined (__TANDEM) +# include +#endif +#endif] , + struct sockaddr_in6 s; s.sin6_scope_id = 0; , have_sin6_scope_id=yes) + if test "$have_sin6_scope_id" = yes; then + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID, 1, [Define to 1 if struct sockaddr_in6 has the sin6_scope_id member]) + else + AC_MSG_RESULT([no]) + fi +fi + +dnl ********************************************************************** +dnl Check if the operating system allows programs to write to their own argv[] +dnl ********************************************************************** + +AC_MSG_CHECKING([if argv can be written to]) +CURL_RUN_IFELSE([ +int main(int argc, char ** argv) { + argv[0][0] = ' '; + return (argv[0][0] == ' ')?0:1; +} +],[ + curl_cv_writable_argv=yes +],[ + curl_cv_writable_argv=no +],[ + curl_cv_writable_argv=cross +]) +case $curl_cv_writable_argv in +yes) + AC_DEFINE(HAVE_WRITABLE_ARGV, 1, [Define this symbol if your OS supports changing the contents of argv]) + AC_MSG_RESULT(yes) + ;; +no) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_RESULT(no) + AC_MSG_WARN([the previous check could not be made default was used]) + ;; +esac + +dnl ********************************************************************** +dnl Check for GSS-API libraries +dnl ********************************************************************** + +dnl check for GSS-API stuff in the /usr as default + +GSSAPI_ROOT="/usr" +AC_ARG_WITH(gssapi-includes, + AC_HELP_STRING([--with-gssapi-includes=DIR], + [Specify location of GSS-API headers]), + [ GSSAPI_INCS="-I$withval" + want_gss="yes" ] +) + +AC_ARG_WITH(gssapi-libs, + AC_HELP_STRING([--with-gssapi-libs=DIR], + [Specify location of GSS-API libs]), + [ GSSAPI_LIB_DIR="-L$withval" + want_gss="yes" ] +) + +AC_ARG_WITH(gssapi, + AC_HELP_STRING([--with-gssapi=DIR], + [Where to look for GSS-API]), [ + GSSAPI_ROOT="$withval" + if test x"$GSSAPI_ROOT" != xno; then + want_gss="yes" + if test x"$GSSAPI_ROOT" = xyes; then + dnl if yes, then use default root + GSSAPI_ROOT="/usr" + fi + fi +]) + +: ${KRB5CONFIG:="$GSSAPI_ROOT/bin/krb5-config"} + +save_CPPFLAGS="$CPPFLAGS" +AC_MSG_CHECKING([if GSS-API support is requested]) +if test x"$want_gss" = xyes; then + AC_MSG_RESULT(yes) + + if test -z "$GSSAPI_INCS"; then + if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then + GSSAPI_INCS=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --cflags gssapi` + elif test -f "$KRB5CONFIG"; then + GSSAPI_INCS=`$KRB5CONFIG --cflags gssapi` + elif test "$GSSAPI_ROOT" != "yes"; then + GSSAPI_INCS="-I$GSSAPI_ROOT/include" + fi + fi + + CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" + + AC_CHECK_HEADER(gss.h, + [ + dnl found in the given dirs + AC_DEFINE(HAVE_GSSGNU, 1, [if you have GNU GSS]) + gnu_gss=yes + ], + [ + dnl not found, check Heimdal or MIT + AC_CHECK_HEADERS([gssapi/gssapi.h], [], [not_mit=1]) + AC_CHECK_HEADERS( + [gssapi/gssapi_generic.h gssapi/gssapi_krb5.h], + [], + [not_mit=1], + [ +AC_INCLUDES_DEFAULT +#ifdef HAVE_GSSAPI_GSSAPI_H +#include +#endif + ]) + if test "x$not_mit" = "x1"; then + dnl MIT not found, check for Heimdal + AC_CHECK_HEADER(gssapi.h, + [ + dnl found + AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have Heimdal]) + ], + [ + dnl no header found, disabling GSS + want_gss=no + AC_MSG_WARN(disabling GSS-API support since no header files were found) + ] + ) + else + dnl MIT found + AC_DEFINE(HAVE_GSSMIT, 1, [if you have MIT Kerberos]) + dnl check if we have a really old MIT Kerberos version (<= 1.2) + AC_MSG_CHECKING([if GSS-API headers declare GSS_C_NT_HOSTBASED_SERVICE]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include +#include +#include + ]],[[ + gss_import_name( + (OM_uint32 *)0, + (gss_buffer_t)0, + GSS_C_NT_HOSTBASED_SERVICE, + (gss_name_t *)0); + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_DEFINE(HAVE_OLD_GSSMIT, 1, + [if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE]) + ]) + fi + ] + ) +else + AC_MSG_RESULT(no) +fi +if test x"$want_gss" = xyes; then + AC_DEFINE(HAVE_GSSAPI, 1, [if you have GSS-API libraries]) + HAVE_GSSAPI=1 + curl_gss_msg="enabled (MIT Kerberos/Heimdal)" + + if test -n "$gnu_gss"; then + curl_gss_msg="enabled (GNU GSS)" + LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" + LIBS="-lgss $LIBS" + elif test -z "$GSSAPI_LIB_DIR"; then + case $host in + *-*-darwin*) + LIBS="-lgssapi_krb5 -lresolv $LIBS" + ;; + *) + if test -n "$host_alias" -a -f "$GSSAPI_ROOT/bin/$host_alias-krb5-config"; then + dnl krb5-config doesn't have --libs-only-L or similar, put everything + dnl into LIBS + gss_libs=`$GSSAPI_ROOT/bin/$host_alias-krb5-config --libs gssapi` + LIBS="$gss_libs $LIBS" + elif test -f "$KRB5CONFIG"; then + dnl krb5-config doesn't have --libs-only-L or similar, put everything + dnl into LIBS + gss_libs=`$KRB5CONFIG --libs gssapi` + LIBS="$gss_libs $LIBS" + else + case $host in + *-hp-hpux*) + gss_libname="gss" + ;; + *) + gss_libname="gssapi" + ;; + esac + + if test "$GSSAPI_ROOT" != "yes"; then + LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff" + LIBS="-l$gss_libname $LIBS" + else + LIBS="-l$gss_libname $LIBS" + fi + fi + ;; + esac + else + LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" + case $host in + *-hp-hpux*) + LIBS="-lgss $LIBS" + ;; + *) + LIBS="-lgssapi $LIBS" + ;; + esac + fi +else + CPPFLAGS="$save_CPPFLAGS" +fi + +build_libstubgss=no +if test x"$want_gss" = "xyes"; then + build_libstubgss=yes +fi + +AM_CONDITIONAL(BUILD_STUB_GSS, test "x$build_libstubgss" = "xyes") + +dnl ------------------------------------------------------------- +dnl parse --with-default-ssl-backend so it can be validated below +dnl ------------------------------------------------------------- + +DEFAULT_SSL_BACKEND=no +VALID_DEFAULT_SSL_BACKEND= +AC_ARG_WITH(default-ssl-backend, +AC_HELP_STRING([--with-default-ssl-backend=NAME],[Use NAME as default SSL backend]) +AC_HELP_STRING([--without-default-ssl-backend],[Use implicit default SSL backend]), + [DEFAULT_SSL_BACKEND=$withval]) +case "$DEFAULT_SSL_BACKEND" in + no) + dnl --without-default-ssl-backend option used + ;; + default|yes) + dnl --with-default-ssl-backend option used without name + AC_MSG_ERROR([The name of the default SSL backend is required.]) + ;; + *) + dnl --with-default-ssl-backend option used with name + AC_SUBST(DEFAULT_SSL_BACKEND) + dnl needs to be validated below + VALID_DEFAULT_SSL_BACKEND=no + ;; +esac + +dnl ********************************************************************** + +dnl ------------------------------------------------- +dnl check winssl option before other SSL libraries +dnl ------------------------------------------------- + +OPT_WINSSL=no +AC_ARG_WITH(winssl,dnl +AC_HELP_STRING([--with-winssl],[enable Windows native SSL/TLS]) +AC_HELP_STRING([--without-winssl], [disable Windows native SSL/TLS]), + OPT_WINSSL=$withval) + +AC_ARG_WITH(schannel,dnl +AC_HELP_STRING([--with-schannel],[enable Windows native SSL/TLS]) +AC_HELP_STRING([--without-schannel], [disable Windows native SSL/TLS]), + OPT_WINSSL=$withval) + +AC_MSG_CHECKING([whether to enable Windows native SSL/TLS (Windows native builds only)]) +if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then + ssl_msg= + if test "x$OPT_WINSSL" != "xno" && + test "x$curl_cv_native_windows" = "xyes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(USE_SCHANNEL, 1, [to enable Windows native SSL/TLS support]) + AC_SUBST(USE_SCHANNEL, [1]) + ssl_msg="Windows-native" + test schannel != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + WINSSL_ENABLED=1 + # --with-winssl implies --enable-sspi + AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) + AC_SUBST(USE_WINDOWS_SSPI, [1]) + curl_sspi_msg="enabled" + LIBS="-lcrypt32 $LIBS" + else + AC_MSG_RESULT(no) + fi + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +else + AC_MSG_RESULT(no) +fi + +OPT_SECURETRANSPORT=no +AC_ARG_WITH(darwinssl,dnl +AC_HELP_STRING([--with-darwinssl],[enable Apple OS native SSL/TLS]) +AC_HELP_STRING([--without-darwinssl], [disable Apple OS native SSL/TLS]), + OPT_SECURETRANSPORT=$withval) + +AC_ARG_WITH(secure-transport,dnl +AC_HELP_STRING([--with-secure-transport],[enable Apple OS native SSL/TLS]) +AC_HELP_STRING([--without-secure-transport], [disable Apple OS native SSL/TLS]), + OPT_SECURETRANSPORT=$withval) + +AC_MSG_CHECKING([whether to enable Secure Transport]) +if test -z "$ssl_backends" -o "x$OPT_SECURETRANSPORT" != xno; then + if test "x$OPT_SECURETRANSPORT" != "xno" && + test -d "/System/Library/Frameworks/Security.framework"; then + AC_MSG_RESULT(yes) + AC_DEFINE(USE_SECTRANSP, 1, [enable Secure Transport]) + AC_SUBST(USE_SECTRANSP, [1]) + ssl_msg="Secure Transport" + test secure-transport != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + SECURETRANSPORT_ENABLED=1 + LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security" + else + AC_MSG_RESULT(no) + fi + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +else + AC_MSG_RESULT(no) +fi + +OPT_AMISSL=no +AC_ARG_WITH(amissl,dnl +AC_HELP_STRING([--with-amissl],[enable Amiga native SSL/TLS (AmiSSL)]) +AC_HELP_STRING([--without-amissl], [disable Amiga native SSL/TLS (AmiSSL)]), + OPT_AMISSL=$withval) + +AC_MSG_CHECKING([whether to enable Amiga native SSL/TLS (AmiSSL)]) +if test "$HAVE_PROTO_BSDSOCKET_H" = "1"; then + if test -z "$ssl_backends" -o "x$OPT_AMISSL" != xno; then + ssl_msg= + if test "x$OPT_AMISSL" != "xno"; then + AC_MSG_RESULT(yes) + ssl_msg="AmiSSL" + test amissl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + AMISSL_ENABLED=1 + LIBS="-lamisslauto $LIBS" + AC_DEFINE(USE_AMISSL, 1, [if AmiSSL is in use]) + AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]) + else + AC_MSG_RESULT(no) + fi + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" + else + AC_MSG_RESULT(no) + fi +else + AC_MSG_RESULT(no) +fi + +dnl ********************************************************************** +dnl Check for the presence of SSL libraries and headers +dnl ********************************************************************** + +dnl Default to compiler & linker defaults for SSL files & libraries. +OPT_SSL=off +dnl Default to no CA bundle +ca="no" +AC_ARG_WITH(ssl,dnl +AC_HELP_STRING([--with-ssl=PATH],[Where to look for OpenSSL, PATH points to the SSL installation (default: /usr/local/ssl); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--without-ssl], [disable OpenSSL]), + OPT_SSL=$withval) + +if test -z "$ssl_backends" -o "x$OPT_SSL" != xno && + test X"$OPT_SSL" != Xno; then + ssl_msg= + + dnl backup the pre-ssl variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + dnl This is for Msys/Mingw + case $host in + *-*-msys* | *-*-mingw*) + AC_MSG_CHECKING([for gdi32]) + my_ac_save_LIBS=$LIBS + LIBS="-lgdi32 $LIBS" + AC_TRY_LINK([#include + #include ], + [GdiFlush();], + [ dnl worked! + AC_MSG_RESULT([yes])], + [ dnl failed, restore LIBS + LIBS=$my_ac_save_LIBS + AC_MSG_RESULT(no)] + ) + ;; + esac + + case "$OPT_SSL" in + yes) + dnl --with-ssl (without path) used + if test x$cross_compiling != xyes; then + dnl only do pkg-config magic when not cross-compiling + PKGTEST="yes" + fi + PREFIX_OPENSSL=/usr/local/ssl + LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" + ;; + off) + dnl no --with-ssl option given, just check default places + if test x$cross_compiling != xyes; then + dnl only do pkg-config magic when not cross-compiling + PKGTEST="yes" + fi + PREFIX_OPENSSL= + ;; + *) + dnl check the given --with-ssl spot + PKGTEST="no" + PREFIX_OPENSSL=$OPT_SSL + + dnl Try pkg-config even when cross-compiling. Since we + dnl specify PKG_CONFIG_LIBDIR we're only looking where + dnl the user told us to look + OPENSSL_PCDIR="$OPT_SSL/lib/pkgconfig" + if test -f "$OPENSSL_PCDIR/openssl.pc"; then + AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"]) + PKGTEST="yes" + elif test ! -f "$PREFIX_OPENSSL/include/openssl/ssl.h"; then + AC_MSG_ERROR([$PREFIX_OPENSSL is a bad --with-ssl prefix!]) + fi + + dnl in case pkg-config comes up empty, use what we got + dnl via --with-ssl + LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" + if test "$PREFIX_OPENSSL" != "/usr" ; then + SSL_LDFLAGS="-L$LIB_OPENSSL" + SSL_CPPFLAGS="-I$PREFIX_OPENSSL/include" + fi + SSL_CPPFLAGS="$SSL_CPPFLAGS -I$PREFIX_OPENSSL/include/openssl" + ;; + esac + + if test "$PKGTEST" = "yes"; then + + CURL_CHECK_PKGCONFIG(openssl, [$OPENSSL_PCDIR]) + + if test "$PKGCONFIG" != "no" ; then + SSL_LIBS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl + $PKGCONFIG --libs-only-l --libs-only-other openssl 2>/dev/null` + + SSL_LDFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl + $PKGCONFIG --libs-only-L openssl 2>/dev/null` + + SSL_CPPFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl + $PKGCONFIG --cflags-only-I openssl 2>/dev/null` + + AC_SUBST(SSL_LIBS) + AC_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"]) + AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"]) + AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"]) + + LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'` + + dnl use the values pkg-config reported. This is here + dnl instead of below with CPPFLAGS and LDFLAGS because we only + dnl learn about this via pkg-config. If we only have + dnl the argument to --with-ssl we don't know what + dnl additional libs may be necessary. Hope that we + dnl don't need any. + LIBS="$SSL_LIBS $LIBS" + fi + fi + + dnl finally, set flags to use SSL + CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" + LDFLAGS="$LDFLAGS $SSL_LDFLAGS" + + AC_CHECK_LIB(crypto, HMAC_Update,[ + HAVECRYPTO="yes" + LIBS="-lcrypto $LIBS" + ],[ + LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL" + if test "$PKGCONFIG" = "no" ; then + # only set this if pkg-config wasn't used + CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" + fi + AC_CHECK_LIB(crypto, HMAC_Init_ex,[ + HAVECRYPTO="yes" + LIBS="-lcrypto $LIBS"], [ + + dnl still no, but what about with -ldl? + AC_MSG_CHECKING([OpenSSL linking with -ldl]) + LIBS="$CLEANLIBS -lcrypto -ldl" + AC_TRY_LINK( + [ + #include + ], + [ + ERR_clear_error(); + ], + [ + AC_MSG_RESULT(yes) + HAVECRYPTO="yes" + ], + [ + AC_MSG_RESULT(no) + dnl ok, so what about both -ldl and -lpthread? + + AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread]) + LIBS="$CLEANLIBS -lcrypto -ldl -lpthread" + AC_TRY_LINK( + [ + #include + ], + [ + ERR_clear_error(); + ], + [ + AC_MSG_RESULT(yes) + HAVECRYPTO="yes" + ], + [ + AC_MSG_RESULT(no) + LDFLAGS="$CLEANLDFLAGS" + CPPFLAGS="$CLEANCPPFLAGS" + LIBS="$CLEANLIBS" + + ]) + + ]) + + ]) + ]) + + if test X"$HAVECRYPTO" = X"yes"; then + dnl This is only reasonable to do if crypto actually is there: check for + dnl SSL libs NOTE: it is important to do this AFTER the crypto lib + + AC_CHECK_LIB(ssl, SSL_connect) + + if test "$ac_cv_lib_ssl_SSL_connect" != yes; then + dnl we didn't find the SSL lib, try the RSAglue/rsaref stuff + AC_MSG_CHECKING(for ssl with RSAglue/rsaref libs in use); + OLIBS=$LIBS + LIBS="-lRSAglue -lrsaref $LIBS" + AC_CHECK_LIB(ssl, SSL_connect) + if test "$ac_cv_lib_ssl_SSL_connect" != yes; then + dnl still no SSL_connect + AC_MSG_RESULT(no) + LIBS=$OLIBS + else + AC_MSG_RESULT(yes) + fi + + else + + dnl Have the libraries--check for OpenSSL headers + AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ + openssl/pem.h openssl/ssl.h openssl/err.h, + ssl_msg="OpenSSL" + test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + OPENSSL_ENABLED=1 + AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use])) + + if test $ac_cv_header_openssl_x509_h = no; then + dnl we don't use the "action" part of the AC_CHECK_HEADERS macro + dnl since 'err.h' might in fact find a krb4 header with the same + dnl name + AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h) + + if test $ac_cv_header_x509_h = yes && + test $ac_cv_header_crypto_h = yes && + test $ac_cv_header_ssl_h = yes; then + dnl three matches + ssl_msg="OpenSSL" + OPENSSL_ENABLED=1 + fi + fi + fi + + if test X"$OPENSSL_ENABLED" != X"1"; then + LIBS="$CLEANLIBS" + fi + + if test X"$OPT_SSL" != Xoff && + test "$OPENSSL_ENABLED" != "1"; then + AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!]) + fi + fi + + if test X"$OPENSSL_ENABLED" = X"1"; then + dnl These can only exist if OpenSSL exists + dnl OpenSSL_version is introduced in 3.0.0 + + AC_CHECK_FUNCS( RAND_egd \ + SSLv2_client_method \ + OpenSSL_version ) + + AC_MSG_CHECKING([for BoringSSL]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + #include + ]],[[ + #ifndef OPENSSL_IS_BORINGSSL + #error not boringssl + #endif + ]]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1, + [Define to 1 if using BoringSSL.]) + ssl_msg="BoringSSL" + ],[ + AC_MSG_RESULT([no]) + ]) + + AC_MSG_CHECKING([for libressl]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]],[[ + int dummy = LIBRESSL_VERSION_NUMBER; + ]]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(HAVE_LIBRESSL, 1, + [Define to 1 if using libressl.]) + ssl_msg="libressl" + ],[ + AC_MSG_RESULT([no]) + ]) + fi + + if test "$OPENSSL_ENABLED" = "1"; then + if test -n "$LIB_OPENSSL"; then + dnl when the ssl shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH + dnl to prevent further configure tests to fail due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_OPENSSL" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $LIB_OPENSSL to CURL_LIBRARY_PATH]) + fi + fi + CURL_CHECK_OPENSSL_API + check_for_ca_bundle=1 + fi + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +if test X"$OPT_SSL" != Xoff && + test X"$OPT_SSL" != Xno && + test "$OPENSSL_ENABLED" != "1"; then + AC_MSG_NOTICE([OPT_SSL: $OPT_SSL]) + AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED]) + AC_MSG_ERROR([--with-ssl was given but OpenSSL could not be detected]) +fi + +dnl ********************************************************************** +dnl Check for the random seed preferences +dnl ********************************************************************** + +if test X"$OPENSSL_ENABLED" = X"1"; then + AC_ARG_WITH(egd-socket, + AC_HELP_STRING([--with-egd-socket=FILE], + [Entropy Gathering Daemon socket pathname]), + [ EGD_SOCKET="$withval" ] + ) + if test -n "$EGD_SOCKET" ; then + AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET", + [your Entropy Gathering Daemon socket pathname] ) + fi + + dnl Check for user-specified random device + AC_ARG_WITH(random, + AC_HELP_STRING([--with-random=FILE], + [read randomness from FILE (default=/dev/urandom)]), + [ RANDOM_FILE="$withval" ], + [ + if test x$cross_compiling != xyes; then + dnl Check for random device + AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] ) + else + AC_MSG_WARN([skipped the /dev/urandom detection when cross-compiling]) + fi + ] + ) + if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then + AC_SUBST(RANDOM_FILE) + AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE", + [a suitable file to read random data from]) + fi +fi + +dnl --- +dnl We require OpenSSL with SRP support. +dnl --- +if test "$OPENSSL_ENABLED" = "1"; then + AC_CHECK_LIB(crypto, SRP_Calc_client_key, + [ + AC_DEFINE(HAVE_OPENSSL_SRP, 1, [if you have the function SRP_Calc_client_key]) + AC_SUBST(HAVE_OPENSSL_SRP, [1]) + ]) +fi + +dnl --- +dnl Whether the OpenSSL configuration will be loaded automatically +dnl --- +if test X"$OPENSSL_ENABLED" = X"1"; then +AC_ARG_ENABLE(openssl-auto-load-config, +AC_HELP_STRING([--enable-openssl-auto-load-config],[Enable automatic loading of OpenSSL configuration]) +AC_HELP_STRING([--disable-openssl-auto-load-config],[Disable automatic loading of OpenSSL configuration]), +[ if test X"$enableval" = X"no"; then + AC_MSG_NOTICE([automatic loading of OpenSSL configuration disabled]) + AC_DEFINE(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG, 1, [if the OpenSSL configuration won't be loaded automatically]) + fi +]) +fi + +dnl ---------------------------------------------------- +dnl check for GnuTLS +dnl ---------------------------------------------------- + +dnl Default to compiler & linker defaults for GnuTLS files & libraries. +OPT_GNUTLS=no + +AC_ARG_WITH(gnutls,dnl +AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root]) +AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]), + OPT_GNUTLS=$withval) + +if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then + ssl_msg= + + if test X"$OPT_GNUTLS" != Xno; then + + addld="" + addlib="" + gtlslib="" + version="" + addcflags="" + + if test "x$OPT_GNUTLS" = "xyes"; then + dnl this is with no partiular path given + CURL_CHECK_PKGCONFIG(gnutls) + + if test "$PKGCONFIG" != "no" ; then + addlib=`$PKGCONFIG --libs-only-l gnutls` + addld=`$PKGCONFIG --libs-only-L gnutls` + addcflags=`$PKGCONFIG --cflags-only-I gnutls` + version=`$PKGCONFIG --modversion gnutls` + gtlslib=`echo $addld | $SED -e 's/-L//'` + else + dnl without pkg-config, we try libgnutls-config as that was how it + dnl used to be done + check=`libgnutls-config --version 2>/dev/null` + if test -n "$check"; then + addlib=`libgnutls-config --libs` + addcflags=`libgnutls-config --cflags` + version=`libgnutls-config --version` + gtlslib=`libgnutls-config --prefix`/lib$libsuff + fi + fi + else + dnl this is with a given path, first check if there's a libgnutls-config + dnl there and if not, make an educated guess + cfg=$OPT_GNUTLS/bin/libgnutls-config + check=`$cfg --version 2>/dev/null` + if test -n "$check"; then + addlib=`$cfg --libs` + addcflags=`$cfg --cflags` + version=`$cfg --version` + gtlslib=`$cfg --prefix`/lib$libsuff + else + dnl without pkg-config and libgnutls-config, we guess a lot! + addlib=-lgnutls + addld=-L$OPT_GNUTLS/lib$libsuff + addcflags=-I$OPT_GNUTLS/include + version="" # we just don't know + gtlslib=$OPT_GNUTLS/lib$libsuff + fi + fi + + if test -z "$version"; then + dnl lots of efforts, still no go + version="unknown" + fi + + if test -n "$addlib"; then + + CLEANLIBS="$LIBS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLDFLAGS="$LDFLAGS" + + LIBS="$addlib $LIBS" + LDFLAGS="$LDFLAGS $addld" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + AC_CHECK_LIB(gnutls, gnutls_check_version, + [ + AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled]) + AC_SUBST(USE_GNUTLS, [1]) + GNUTLS_ENABLED=1 + USE_GNUTLS="yes" + ssl_msg="GnuTLS" + test gnutls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + LIBS="$CLEANLIBS" + CPPFLAGS="$CLEANCPPFLAGS" + ]) + + if test "x$USE_GNUTLS" = "xyes"; then + AC_MSG_NOTICE([detected GnuTLS version $version]) + check_for_ca_bundle=1 + if test -n "$gtlslib"; then + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl CURL_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$gtlslib" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $gtlslib to CURL_LIBRARY_PATH]) + fi + fi + AC_CHECK_FUNCS([gnutls_certificate_set_x509_key_file2 gnutls_alpn_set_protocols gnutls_ocsp_req_init]) + fi + + fi + + fi dnl GNUTLS not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +dnl --- +dnl Check which crypto backend GnuTLS uses +dnl --- + +if test "$GNUTLS_ENABLED" = "1"; then + USE_GNUTLS_NETTLE= + # First check if we can detect either crypto library via transitive linking + AC_CHECK_LIB(gnutls, nettle_MD5Init, [ USE_GNUTLS_NETTLE=1 ]) + if test "$USE_GNUTLS_NETTLE" = ""; then + AC_CHECK_LIB(gnutls, gcry_control, [ USE_GNUTLS_NETTLE=0 ]) + fi + # If not, try linking directly to both of them to see if they are available + if test "$USE_GNUTLS_NETTLE" = ""; then + AC_CHECK_LIB(nettle, nettle_MD5Init, [ USE_GNUTLS_NETTLE=1 ]) + fi + if test "$USE_GNUTLS_NETTLE" = ""; then + AC_CHECK_LIB(gcrypt, gcry_control, [ USE_GNUTLS_NETTLE=0 ]) + fi + if test "$USE_GNUTLS_NETTLE" = ""; then + AC_MSG_ERROR([GnuTLS found, but neither gcrypt nor nettle found]) + fi + if test "$USE_GNUTLS_NETTLE" = "1"; then + AC_DEFINE(USE_GNUTLS_NETTLE, 1, [if GnuTLS uses nettle as crypto backend]) + AC_SUBST(USE_GNUTLS_NETTLE, [1]) + LIBS="-lnettle $LIBS" + else + LIBS="-lgcrypt $LIBS" + fi +fi + +dnl --- +dnl We require GnuTLS with SRP support. +dnl --- +if test "$GNUTLS_ENABLED" = "1"; then + AC_CHECK_LIB(gnutls, gnutls_srp_verifier, + [ + AC_DEFINE(HAVE_GNUTLS_SRP, 1, [if you have the function gnutls_srp_verifier]) + AC_SUBST(HAVE_GNUTLS_SRP, [1]) + ]) +fi + +dnl ---------------------------------------------------- +dnl check for mbedTLS +dnl ---------------------------------------------------- + +OPT_MBEDTLS=no + +_cppflags=$CPPFLAGS +_ldflags=$LDFLAGS +AC_ARG_WITH(mbedtls,dnl +AC_HELP_STRING([--with-mbedtls=PATH],[where to look for mbedTLS, PATH points to the installation root]) +AC_HELP_STRING([--without-mbedtls], [disable mbedTLS detection]), + OPT_MBEDTLS=$withval) + +if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then + ssl_msg= + + if test X"$OPT_MBEDTLS" != Xno; then + + if test "$OPT_MBEDTLS" = "yes"; then + OPT_MBEDTLS="" + fi + + if test -z "$OPT_MBEDTLS" ; then + dnl check for lib first without setting any new path + + AC_CHECK_LIB(mbedtls, mbedtls_havege_init, + dnl libmbedtls found, set the variable + [ + AC_DEFINE(USE_MBEDTLS, 1, [if mbedTLS is enabled]) + AC_SUBST(USE_MBEDTLS, [1]) + MBEDTLS_ENABLED=1 + USE_MBEDTLS="yes" + ssl_msg="mbedTLS" + test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], [], -lmbedx509 -lmbedcrypto) + fi + + addld="" + addlib="" + addcflags="" + mbedtlslib="" + + if test "x$USE_MBEDTLS" != "xyes"; then + dnl add the path and test again + addld=-L$OPT_MBEDTLS/lib$libsuff + addcflags=-I$OPT_MBEDTLS/include + mbedtlslib=$OPT_MBEDTLS/lib$libsuff + + LDFLAGS="$LDFLAGS $addld" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + AC_CHECK_LIB(mbedtls, mbedtls_ssl_init, + [ + AC_DEFINE(USE_MBEDTLS, 1, [if mbedTLS is enabled]) + AC_SUBST(USE_MBEDTLS, [1]) + MBEDTLS_ENABLED=1 + USE_MBEDTLS="yes" + ssl_msg="mbedTLS" + test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + CPPFLAGS=$_cppflags + LDFLAGS=$_ldflags + ], -lmbedx509 -lmbedcrypto) + fi + + if test "x$USE_MBEDTLS" = "xyes"; then + AC_MSG_NOTICE([detected mbedTLS]) + check_for_ca_bundle=1 + + LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS" + + if test -n "$mbedtlslib"; then + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl CURL_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$mbedtlslib" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $mbedtlslib to CURL_LIBRARY_PATH]) + fi + fi + fi + + fi dnl mbedTLS not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +dnl ---------------------------------------------------- +dnl check for wolfSSL +dnl ---------------------------------------------------- + +dnl Default to compiler & linker defaults for wolfSSL files & libraries. +OPT_WOLFSSL=no + +_cppflags=$CPPFLAGS +_ldflags=$LDFLAGS + +AC_ARG_WITH(wolfssl,dnl +AC_HELP_STRING([--with-wolfssl=PATH],[where to look for WolfSSL, PATH points to the installation root (default: system lib default)]) +AC_HELP_STRING([--without-wolfssl], [disable WolfSSL detection]), + OPT_WOLFSSL=$withval) + +if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then + ssl_msg= + + if test X"$OPT_WOLFSSL" != Xno; then + + if test "$OPT_WOLFSSL" = "yes"; then + OPT_WOLFSSL="" + fi + + addld="" + addlib="" + addcflags="" + + if test "x$USE_WOLFSSL" != "xyes"; then + addld=-L$OPT_WOLFSSL/lib$libsuff + addcflags=-I$OPT_WOLFSSL/include + wolfssllibpath=$OPT_WOLFSSL/lib$libsuff + + LDFLAGS="$LDFLAGS $addld" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + my_ac_save_LIBS="$LIBS" + LIBS="-lwolfssl -lm $LIBS" + + AC_MSG_CHECKING([for wolfSSL_Init in -lwolfssl]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +/* These aren't needed for detection and confuse WolfSSL. + They are set up properly later if it is detected. */ +#undef SIZEOF_LONG +#undef SIZEOF_LONG_LONG +#include + ]],[[ + return wolfSSL_Init(); + ]]) + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(USE_WOLFSSL, 1, [if wolfSSL is enabled]) + AC_SUBST(USE_WOLFSSL, [1]) + WOLFSSL_ENABLED=1 + USE_WOLFSSL="yes" + ssl_msg="WolfSSL" + test wolfssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + AC_MSG_RESULT(no) + CPPFLAGS=$_cppflags + LDFLAGS=$_ldflags + wolfssllibpath="" + ]) + LIBS="$my_ac_save_LIBS" + fi + + if test "x$USE_WOLFSSL" = "xyes"; then + AC_MSG_NOTICE([detected wolfSSL]) + check_for_ca_bundle=1 + + dnl wolfssl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined! + AX_COMPILE_CHECK_SIZEOF(long long) + + LIBS="-lwolfssl -lm $LIBS" + + dnl Recent WolfSSL versions build without SSLv3 by default + dnl WolfSSL needs configure --enable-opensslextra to have *get_peer* + AC_CHECK_FUNCS(wolfSSLv3_client_method \ + wolfSSL_get_peer_certificate \ + wolfSSL_UseALPN) + + if test -n "$wolfssllibpath"; then + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl CURL_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $wolfssllibpath to CURL_LIBRARY_PATH]) + fi + fi + + fi + + fi dnl wolfSSL not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +dnl ---------------------------------------------------- +dnl check for MesaLink +dnl ---------------------------------------------------- + +dnl Default to compiler & linker defaults for MesaLink files & libraries. +OPT_MESALINK=no + +_cppflags=$CPPFLAGS +_ldflags=$LDFLAGS +AC_ARG_WITH(mesalink,dnl +AC_HELP_STRING([--with-mesalink=PATH],[where to look for MesaLink, PATH points to the installation root]) +AC_HELP_STRING([--without-mesalink], [disable MesaLink detection]), + OPT_MESALINK=$withval) + +if test -z "$ssl_backends" -o "x$OPT_MESALINK" != xno; then + ssl_msg= + + if test X"$OPT_MESALINK" != Xno; then + + if test "$OPT_MESALINK" = "yes"; then + OPT_MESALINK="" + fi + + if test -z "$OPT_MESALINK" ; then + dnl check for lib first without setting any new path + + AC_CHECK_LIB(mesalink, mesalink_library_init, + dnl libmesalink found, set the variable + [ + AC_DEFINE(USE_MESALINK, 1, [if MesaLink is enabled]) + AC_SUBST(USE_MESALINK, [1]) + MESALINK_ENABLED=1 + USE_MESALINK="yes" + ssl_msg="MesaLink" + test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ]) + fi + + addld="" + addlib="" + addcflags="" + mesalinklib="" + + if test "x$USE_MESALINK" != "xyes"; then + dnl add the path and test again + addld=-L$OPT_MESALINK/lib$libsuff + addcflags=-I$OPT_MESALINK/include + mesalinklib=$OPT_MESALINK/lib$libsuff + + LDFLAGS="$LDFLAGS $addld" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + AC_CHECK_LIB(mesalink, mesalink_library_init, + [ + AC_DEFINE(USE_MESALINK, 1, [if MesaLink is enabled]) + AC_SUBST(USE_MESALINK, [1]) + MESALINK_ENABLED=1 + USE_MESALINK="yes" + ssl_msg="MesaLink" + test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + CPPFLAGS=$_cppflags + LDFLAGS=$_ldflags + ]) + fi + + if test "x$USE_MESALINK" = "xyes"; then + AC_MSG_NOTICE([detected MesaLink]) + + LIBS="-lmesalink $LIBS" + + if test -n "$mesalinklib"; then + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl LD_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$mesalinklib" + export LD_LIBRARY_PATH + AC_MSG_NOTICE([Added $mesalinklib to LD_LIBRARY_PATH]) + fi + fi + fi + + fi dnl MesaLink not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +dnl ---------------------------------------------------- +dnl check for BearSSL +dnl ---------------------------------------------------- + +OPT_BEARSSL=no + +_cppflags=$CPPFLAGS +_ldflags=$LDFLAGS +AC_ARG_WITH(bearssl,dnl +AC_HELP_STRING([--with-bearssl=PATH],[where to look for BearSSL, PATH points to the installation root]) +AC_HELP_STRING([--without-bearssl], [disable BearSSL detection]), + OPT_BEARSSL=$withval) + +if test -z "$ssl_backends" -o "x$OPT_BEARSSL" != xno; then + ssl_msg= + + if test X"$OPT_BEARSSL" != Xno; then + + if test "$OPT_BEARSSL" = "yes"; then + OPT_BEARSSL="" + fi + + if test -z "$OPT_BEARSSL" ; then + dnl check for lib first without setting any new path + + AC_CHECK_LIB(bearssl, br_ssl_client_init_full, + dnl libbearssl found, set the variable + [ + AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled]) + AC_SUBST(USE_BEARSSL, [1]) + BEARSSL_ENABLED=1 + USE_BEARSSL="yes" + ssl_msg="BearSSL" + test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], [], -lbearssl) + fi + + addld="" + addlib="" + addcflags="" + bearssllib="" + + if test "x$USE_BEARSSL" != "xyes"; then + dnl add the path and test again + addld=-L$OPT_BEARSSL/lib$libsuff + addcflags=-I$OPT_BEARSSL/include + bearssllib=$OPT_BEARSSL/lib$libsuff + + LDFLAGS="$LDFLAGS $addld" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + AC_CHECK_LIB(bearssl, br_ssl_client_init_full, + [ + AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled]) + AC_SUBST(USE_BEARSSL, [1]) + BEARSSL_ENABLED=1 + USE_BEARSSL="yes" + ssl_msg="BearSSL" + test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + CPPFLAGS=$_cppflags + LDFLAGS=$_ldflags + ], -lbearssl) + fi + + if test "x$USE_BEARSSL" = "xyes"; then + AC_MSG_NOTICE([detected BearSSL]) + check_for_ca_bundle=1 + + LIBS="-lbearssl $LIBS" + + if test -n "$bearssllib"; then + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl CURL_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$bearssllib" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $bearssllib to CURL_LIBRARY_PATH]) + fi + fi + fi + + fi dnl BearSSL not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +dnl ---------------------------------------------------- +dnl NSS. Only check if GnuTLS and OpenSSL are not enabled +dnl ---------------------------------------------------- + +dnl Default to compiler & linker defaults for NSS files & libraries. +OPT_NSS=no + +AC_ARG_WITH(nss,dnl +AC_HELP_STRING([--with-nss=PATH],[where to look for NSS, PATH points to the installation root]) +AC_HELP_STRING([--without-nss], [disable NSS detection]), + OPT_NSS=$withval) + +if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then + ssl_msg= + + if test X"$OPT_NSS" != Xno; then + + addld="" + addlib="" + addcflags="" + nssprefix="" + version="" + + if test "x$OPT_NSS" = "xyes"; then + + CURL_CHECK_PKGCONFIG(nss) + + if test "$PKGCONFIG" != "no" ; then + addlib=`$PKGCONFIG --libs nss` + addcflags=`$PKGCONFIG --cflags nss` + version=`$PKGCONFIG --modversion nss` + nssprefix=`$PKGCONFIG --variable=prefix nss` + else + dnl Without pkg-config, we check for nss-config + + check=`nss-config --version 2>/dev/null` + if test -n "$check"; then + addlib=`nss-config --libs` + addcflags=`nss-config --cflags` + version=`nss-config --version` + nssprefix=`nss-config --prefix` + else + addlib="-lnss3" + addcflags="" + version="unknown" + fi + fi + else + NSS_PCDIR="$OPT_NSS/lib/pkgconfig" + if test -f "$NSS_PCDIR/nss.pc"; then + CURL_CHECK_PKGCONFIG(nss, [$NSS_PCDIR]) + if test "$PKGCONFIG" != "no" ; then + addld=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --libs-only-L nss` + addlib=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --libs-only-l nss` + addcflags=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --cflags nss` + version=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --modversion nss` + nssprefix=`CURL_EXPORT_PCDIR([$NSS_PCDIR]) $PKGCONFIG --variable=prefix nss` + fi + fi + fi + + if test -z "$addlib"; then + # Without pkg-config, we'll kludge in some defaults + AC_MSG_WARN([Using hard-wired libraries and compilation flags for NSS.]) + addld="-L$OPT_NSS/lib" + addlib="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4" + addcflags="-I$OPT_NSS/include" + version="unknown" + nssprefix=$OPT_NSS + fi + + CLEANLDFLAGS="$LDFLAGS" + CLEANLIBS="$LIBS" + CLEANCPPFLAGS="$CPPFLAGS" + + LDFLAGS="$addld $LDFLAGS" + LIBS="$addlib $LIBS" + if test "$addcflags" != "-I/usr/include"; then + CPPFLAGS="$CPPFLAGS $addcflags" + fi + + dnl The function SSL_VersionRangeSet() is needed to enable TLS > 1.0 + AC_CHECK_LIB(nss3, SSL_VersionRangeSet, + [ + AC_DEFINE(USE_NSS, 1, [if NSS is enabled]) + AC_SUBST(USE_NSS, [1]) + USE_NSS="yes" + NSS_ENABLED=1 + ssl_msg="NSS" + test nss != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes + ], + [ + LDFLAGS="$CLEANLDFLAGS" + LIBS="$CLEANLIBS" + CPPFLAGS="$CLEANCPPFLAGS" + ]) + + if test "x$USE_NSS" = "xyes"; then + AC_MSG_NOTICE([detected NSS version $version]) + + dnl PK11_CreateManagedGenericObject() was introduced in NSS 3.34 because + dnl PK11_DestroyGenericObject() does not release resources allocated by + dnl PK11_CreateGenericObject() early enough. + AC_CHECK_FUNC(PK11_CreateManagedGenericObject, + [ + AC_DEFINE(HAVE_PK11_CREATEMANAGEDGENERICOBJECT, 1, + [if you have the PK11_CreateManagedGenericObject function]) + ]) + + dnl needed when linking the curl tool without USE_EXPLICIT_LIB_DEPS + NSS_LIBS=$addlib + AC_SUBST([NSS_LIBS]) + + dnl when shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to + dnl CURL_LIBRARY_PATH to prevent further configure tests to fail + dnl due to this + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$nssprefix/lib$libsuff" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to CURL_LIBRARY_PATH]) + fi + + fi dnl NSS found + + fi dnl NSS not disabled + + test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" +fi + +case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$BEARSSL_ENABLED$AMISSL_ENABLED" in +x) + AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) + AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this.]) + ;; +x1) + # one SSL backend is enabled + AC_SUBST(SSL_ENABLED) + SSL_ENABLED="1" + AC_MSG_NOTICE([built with one SSL backend]) + ;; +*) + # more than one SSL backend is enabled + AC_SUBST(SSL_ENABLED) + SSL_ENABLED="1" + AC_SUBST(CURL_WITH_MULTI_SSL) + CURL_WITH_MULTI_SSL="1" + AC_DEFINE(CURL_WITH_MULTI_SSL, 1, [built with multiple SSL backends]) + AC_MSG_NOTICE([built with multiple SSL backends]) + ;; +esac + +if test -n "$ssl_backends"; then + curl_ssl_msg="enabled ($ssl_backends)" +fi + +if test no = "$VALID_DEFAULT_SSL_BACKEND" +then + if test -n "$SSL_ENABLED" + then + AC_MSG_ERROR([Default SSL backend $DEFAULT_SSL_BACKEND not enabled!]) + else + AC_MSG_ERROR([Default SSL backend requires SSL!]) + fi +elif test yes = "$VALID_DEFAULT_SSL_BACKEND" +then + AC_DEFINE_UNQUOTED([CURL_DEFAULT_SSL_BACKEND], ["$DEFAULT_SSL_BACKEND"], [Default SSL backend]) +fi + +dnl ********************************************************************** +dnl Check for the CA bundle +dnl ********************************************************************** + +if test -n "$check_for_ca_bundle"; then + CURL_CHECK_CA_BUNDLE +fi + +dnl ********************************************************************** +dnl Check for libpsl +dnl ********************************************************************** + +AC_ARG_WITH(libpsl, + AS_HELP_STRING([--without-libpsl], + [disable support for libpsl cookie checking]), + with_libpsl=$withval, + with_libpsl=yes) +if test $with_libpsl != "no"; then + AC_SEARCH_LIBS(psl_builtin, psl, + [curl_psl_msg="enabled"; + AC_DEFINE([USE_LIBPSL], [1], [PSL support enabled]) + ], + [curl_psl_msg="no (libpsl not found)"; + AC_MSG_WARN([libpsl was not found]) + ] + ) +fi +AM_CONDITIONAL([USE_LIBPSL], [test "$curl_psl_msg" = "enabled"]) + +dnl ********************************************************************** +dnl Check for libmetalink +dnl ********************************************************************** + +OPT_LIBMETALINK=no + +AC_ARG_WITH(libmetalink,dnl +AC_HELP_STRING([--with-libmetalink=PATH],[where to look for libmetalink, PATH points to the installation root]) +AC_HELP_STRING([--without-libmetalink], [disable libmetalink detection]), + OPT_LIBMETALINK=$withval) + +if test X"$OPT_LIBMETALINK" != Xno; then + + addld="" + addlib="" + addcflags="" + version="" + libmetalinklib="" + + PKGTEST="no" + if test "x$OPT_LIBMETALINK" = "xyes"; then + dnl this is with no partiular path given + PKGTEST="yes" + CURL_CHECK_PKGCONFIG(libmetalink) + else + dnl When particular path is given, set PKG_CONFIG_LIBDIR using the path. + LIBMETALINK_PCDIR="$OPT_LIBMETALINK/lib/pkgconfig" + AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$LIBMETALINK_PCDIR"]) + if test -f "$LIBMETALINK_PCDIR/libmetalink.pc"; then + PKGTEST="yes" + fi + if test "$PKGTEST" = "yes"; then + CURL_CHECK_PKGCONFIG(libmetalink, [$LIBMETALINK_PCDIR]) + fi + fi + if test "$PKGTEST" = "yes" && test "$PKGCONFIG" != "no"; then + addlib=`CURL_EXPORT_PCDIR([$LIBMETALINK_PCDIR]) dnl + $PKGCONFIG --libs-only-l libmetalink` + addld=`CURL_EXPORT_PCDIR([$LIBMETALINK_PCDIR]) dnl + $PKGCONFIG --libs-only-L libmetalink` + addcflags=`CURL_EXPORT_PCDIR([$LIBMETALINK_PCDIR]) dnl + $PKGCONFIG --cflags-only-I libmetalink` + version=`CURL_EXPORT_PCDIR([$LIBMETALINK_PCDIR]) dnl + $PKGCONFIG --modversion libmetalink` + libmetalinklib=`echo $addld | $SED -e 's/-L//'` + fi + if test -n "$addlib"; then + + clean_CPPFLAGS="$CPPFLAGS" + clean_LDFLAGS="$LDFLAGS" + clean_LIBS="$LIBS" + CPPFLAGS="$clean_CPPFLAGS $addcflags" + LDFLAGS="$clean_LDFLAGS $addld" + LIBS="$addlib $clean_LIBS" + AC_MSG_CHECKING([if libmetalink is recent enough]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +# include + ]],[[ + if(0 != metalink_strerror(0)) /* added in 0.1.0 */ + return 1; + ]]) + ],[ + AC_MSG_RESULT([yes ($version)]) + want_metalink="yes" + ],[ + AC_MSG_RESULT([no ($version)]) + AC_MSG_NOTICE([libmetalink library defective or too old]) + want_metalink="no" + ]) + if test "x$OPENSSL_ENABLED" != "x1" -a "x$USE_WINDOWS_SSPI" != "x1" \ + -a "x$GNUTLS_ENABLED" != "x1" -a "x$NSS_ENABLED" != "x1" \ + -a "x$SECURETRANSPORT_ENABLED" != "x1"; then + AC_MSG_WARN([metalink support requires a compatible SSL/TLS backend]) + want_metalink="no" + fi + CPPFLAGS="$clean_CPPFLAGS" + LDFLAGS="$clean_LDFLAGS" + LIBS="$clean_LIBS" + if test "$want_metalink" = "yes"; then + dnl finally libmetalink will be used + AC_DEFINE(USE_METALINK, 1, [Define to enable metalink support]) + LIBMETALINK_LIBS=$addlib + LIBMETALINK_LDFLAGS=$addld + LIBMETALINK_CPPFLAGS=$addcflags + AC_SUBST([LIBMETALINK_LIBS]) + AC_SUBST([LIBMETALINK_LDFLAGS]) + AC_SUBST([LIBMETALINK_CPPFLAGS]) + curl_mtlnk_msg="enabled" + fi + + fi +fi + +dnl ********************************************************************** +dnl Check for the presence of LIBSSH2 libraries and headers +dnl ********************************************************************** + +dnl Default to compiler & linker defaults for LIBSSH2 files & libraries. +OPT_LIBSSH2=off +AC_ARG_WITH(libssh2,dnl +AC_HELP_STRING([--with-libssh2=PATH],[Where to look for libssh2, PATH points to the libssh2 installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--with-libssh2], [enable libssh2]), + OPT_LIBSSH2=$withval, OPT_LIBSSH2=no) + + +OPT_LIBSSH=off +AC_ARG_WITH(libssh,dnl +AC_HELP_STRING([--with-libssh=PATH],[Where to look for libssh, PATH points to the libssh installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--with-libssh], [enable libssh]), + OPT_LIBSSH=$withval, OPT_LIBSSH=no) + +OPT_WOLFSSH=off +AC_ARG_WITH(wolfssh,dnl +AC_HELP_STRING([--with-wolfssh=PATH],[Where to look for wolfssh, PATH points to the wolfSSH installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--with-wolfssh], [enable wolfssh]), + OPT_WOLFSSH=$withval, OPT_WOLFSSH=no) + +if test X"$OPT_LIBSSH2" != Xno; then + dnl backup the pre-libssh2 variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + case "$OPT_LIBSSH2" in + yes) + dnl --with-libssh2 (without path) used + CURL_CHECK_PKGCONFIG(libssh2) + + if test "$PKGCONFIG" != "no" ; then + LIB_SSH2=`$PKGCONFIG --libs libssh2` + LD_SSH2=`$PKGCONFIG --libs-only-L libssh2` + CPP_SSH2=`$PKGCONFIG --cflags-only-I libssh2` + version=`$PKGCONFIG --modversion libssh2` + DIR_SSH2=`echo $LD_SSH2 | $SED -e 's/-L//'` + fi + + ;; + off) + dnl no --with-libssh2 option given, just check default places + ;; + *) + dnl use the given --with-libssh2 spot + PREFIX_SSH2=$OPT_LIBSSH2 + ;; + esac + + dnl if given with a prefix, we set -L and -I based on that + if test -n "$PREFIX_SSH2"; then + LIB_SSH2="-lssh2" + LD_SSH2=-L${PREFIX_SSH2}/lib$libsuff + CPP_SSH2=-I${PREFIX_SSH2}/include + DIR_SSH2=${PREFIX_SSH2}/lib$libsuff + fi + + LDFLAGS="$LDFLAGS $LD_SSH2" + CPPFLAGS="$CPPFLAGS $CPP_SSH2" + LIBS="$LIB_SSH2 $LIBS" + + AC_CHECK_LIB(ssh2, libssh2_channel_open_ex) + + AC_CHECK_HEADERS(libssh2.h, + curl_ssh_msg="enabled (libSSH2)" + LIBSSH2_ENABLED=1 + AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]) + AC_SUBST(USE_LIBSSH2, [1]) + ) + + if test X"$OPT_LIBSSH2" != Xoff && + test "$LIBSSH2_ENABLED" != "1"; then + AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!]) + fi + + if test "$LIBSSH2_ENABLED" = "1"; then + if test -n "$DIR_SSH2"; then + dnl when the libssh2 shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH + dnl to prevent further configure tests to fail due to this + + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_SSH2" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_SSH2 to CURL_LIBRARY_PATH]) + fi + fi + else + dnl no libssh2, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + fi +elif test X"$OPT_LIBSSH" != Xno; then + dnl backup the pre-libssh variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + case "$OPT_LIBSSH" in + yes) + dnl --with-libssh (without path) used + CURL_CHECK_PKGCONFIG(libssh) + + if test "$PKGCONFIG" != "no" ; then + LIB_SSH=`$PKGCONFIG --libs-only-l libssh` + LD_SSH=`$PKGCONFIG --libs-only-L libssh` + CPP_SSH=`$PKGCONFIG --cflags-only-I libssh` + version=`$PKGCONFIG --modversion libssh` + DIR_SSH=`echo $LD_SSH | $SED -e 's/-L//'` + fi + + ;; + off) + dnl no --with-libssh option given, just check default places + ;; + *) + dnl use the given --with-libssh spot + PREFIX_SSH=$OPT_LIBSSH + ;; + esac + + dnl if given with a prefix, we set -L and -I based on that + if test -n "$PREFIX_SSH"; then + LIB_SSH="-lssh" + LD_SSH=-L${PREFIX_SSH}/lib$libsuff + CPP_SSH=-I${PREFIX_SSH}/include + DIR_SSH=${PREFIX_SSH}/lib$libsuff + fi + + LDFLAGS="$LDFLAGS $LD_SSH" + CPPFLAGS="$CPPFLAGS $CPP_SSH" + LIBS="$LIB_SSH $LIBS" + + AC_CHECK_LIB(ssh, ssh_new) + + AC_CHECK_HEADERS(libssh/libssh.h, + curl_ssh_msg="enabled (libSSH)" + LIBSSH_ENABLED=1 + AC_DEFINE(USE_LIBSSH, 1, [if libSSH is in use]) + AC_SUBST(USE_LIBSSH, [1]) + ) + + if test X"$OPT_LIBSSH" != Xoff && + test "$LIBSSH_ENABLED" != "1"; then + AC_MSG_ERROR([libSSH libs and/or directories were not found where specified!]) + fi + + if test "$LIBSSH_ENABLED" = "1"; then + if test -n "$DIR_SSH"; then + dnl when the libssh shared libs were found in a path that the run-time + dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH + dnl to prevent further configure tests to fail due to this + + if test "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_SSH" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_SSH to CURL_LIBRARY_PATH]) + fi + fi + else + dnl no libssh, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + fi +elif test X"$OPT_WOLFSSH" != Xno; then + dnl backup the pre-wolfssh variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + + if test "$OPT_WOLFSSH" != yes; then + WOLFCONFIG="$OPT_WOLFSSH/bin/wolfssh-config" + LDFLAGS="$LDFLAGS `$WOLFCONFIG --libs`" + CPPFLAGS="$CPPFLAGS `$WOLFCONFIG --cflags`" + fi + + AC_CHECK_LIB(wolfssh, wolfSSH_Init) + + AC_CHECK_HEADERS(wolfssh/ssh.h, + curl_ssh_msg="enabled (wolfSSH)" + WOLFSSH_ENABLED=1 + AC_DEFINE(USE_WOLFSSH, 1, [if wolfSSH is in use]) + AC_SUBST(USE_WOLFSSH, [1]) + ) + +fi + +dnl ********************************************************************** +dnl Check for the presence of LIBRTMP libraries and headers +dnl ********************************************************************** + +dnl Default to compiler & linker defaults for LIBRTMP files & libraries. +OPT_LIBRTMP=off +AC_ARG_WITH(librtmp,dnl +AC_HELP_STRING([--with-librtmp=PATH],[Where to look for librtmp, PATH points to the LIBRTMP installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) +AC_HELP_STRING([--without-librtmp], [disable LIBRTMP]), + OPT_LIBRTMP=$withval) + +if test X"$OPT_LIBRTMP" != Xno; then + dnl backup the pre-librtmp variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + case "$OPT_LIBRTMP" in + yes) + dnl --with-librtmp (without path) used + CURL_CHECK_PKGCONFIG(librtmp) + + if test "$PKGCONFIG" != "no" ; then + LIB_RTMP=`$PKGCONFIG --libs-only-l librtmp` + LD_RTMP=`$PKGCONFIG --libs-only-L librtmp` + CPP_RTMP=`$PKGCONFIG --cflags-only-I librtmp` + version=`$PKGCONFIG --modversion librtmp` + DIR_RTMP=`echo $LD_RTMP | $SED -e 's/-L//'` + else + dnl To avoid link errors, we do not allow --librtmp without + dnl a pkgconfig file + AC_MSG_ERROR([--librtmp was specified but could not find librtmp pkgconfig file.]) + fi + + ;; + off) + dnl no --with-librtmp option given, just check default places + LIB_RTMP="-lrtmp" + ;; + *) + dnl use the given --with-librtmp spot + LIB_RTMP="-lrtmp" + PREFIX_RTMP=$OPT_LIBRTMP + ;; + esac + + dnl if given with a prefix, we set -L and -I based on that + if test -n "$PREFIX_RTMP"; then + LD_RTMP=-L${PREFIX_RTMP}/lib$libsuff + CPP_RTMP=-I${PREFIX_RTMP}/include + DIR_RTMP=${PREFIX_RTMP}/lib$libsuff + fi + + LDFLAGS="$LDFLAGS $LD_RTMP" + CPPFLAGS="$CPPFLAGS $CPP_RTMP" + LIBS="$LIB_RTMP $LIBS" + + AC_CHECK_LIB(rtmp, RTMP_Init, + [ + AC_CHECK_HEADERS(librtmp/rtmp.h, + curl_rtmp_msg="enabled (librtmp)" + LIBRTMP_ENABLED=1 + AC_DEFINE(USE_LIBRTMP, 1, [if librtmp is in use]) + AC_SUBST(USE_LIBRTMP, [1]) + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + + if test X"$OPT_LIBRTMP" != Xoff && + test "$LIBRTMP_ENABLED" != "1"; then + AC_MSG_ERROR([librtmp libs and/or directories were not found where specified!]) + fi + +fi + +dnl ********************************************************************** +dnl Check for linker switch for versioned symbols +dnl ********************************************************************** + +versioned_symbols_flavour= +AC_MSG_CHECKING([whether versioned symbols are wanted]) +AC_ARG_ENABLE(versioned-symbols, +AC_HELP_STRING([--enable-versioned-symbols], [Enable versioned symbols in shared library]) +AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shared library]), +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + AC_MSG_CHECKING([if libraries can be versioned]) + GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script` + if test -z "$GLD"; then + AC_MSG_RESULT(no) + AC_MSG_WARN([You need an ld version supporting the --version-script option]) + else + AC_MSG_RESULT(yes) + if test "x$CURL_WITH_MULTI_SSL" = "x1"; then + versioned_symbols_flavour="MULTISSL_" + elif test "x$OPENSSL_ENABLED" = "x1"; then + versioned_symbols_flavour="OPENSSL_" + elif test "x$GNUTLS_ENABLED" = "x1"; then + versioned_symbols_flavour="GNUTLS_" + elif test "x$NSS_ENABLED" = "x1"; then + versioned_symbols_flavour="NSS_" + elif test "x$WOLFSSL_ENABLED" = "x1"; then + versioned_symbols_flavour="WOLFSSL_" + elif test "x$WINSSL_ENABLED" = "x1"; then + versioned_symbols_flavour="SCHANNEL_" + elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then + versioned_symbols_flavour="SECURE_TRANSPORT_" + else + versioned_symbols_flavour="" + fi + versioned_symbols="yes" + fi + ;; + + *) AC_MSG_RESULT(no) + ;; + esac +], [ +AC_MSG_RESULT(no) +] +) + +AC_SUBST([CURL_LT_SHLIB_VERSIONED_FLAVOUR], + ["$versioned_symbols_flavour"]) +AM_CONDITIONAL([CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS], + [test "x$versioned_symbols" = 'xyes']) + +dnl ------------------------------------------------- +dnl check winidn option before other IDN libraries +dnl ------------------------------------------------- + +AC_MSG_CHECKING([whether to enable Windows native IDN (Windows native builds only)]) +OPT_WINIDN="default" +AC_ARG_WITH(winidn, +AC_HELP_STRING([--with-winidn=PATH],[enable Windows native IDN]) +AC_HELP_STRING([--without-winidn], [disable Windows native IDN]), + OPT_WINIDN=$withval) +case "$OPT_WINIDN" in + no|default) + dnl --without-winidn option used or configure option not specified + want_winidn="no" + AC_MSG_RESULT([no]) + ;; + yes) + dnl --with-winidn option used without path + want_winidn="yes" + want_winidn_path="default" + AC_MSG_RESULT([yes]) + ;; + *) + dnl --with-winidn option used with path + want_winidn="yes" + want_winidn_path="$withval" + AC_MSG_RESULT([yes ($withval)]) + ;; +esac + +if test "$want_winidn" = "yes"; then + dnl winidn library support has been requested + clean_CPPFLAGS="$CPPFLAGS" + clean_LDFLAGS="$LDFLAGS" + clean_LIBS="$LIBS" + WINIDN_LIBS="-lnormaliz" + WINIDN_CPPFLAGS="-DWINVER=0x0600" + # + if test "$want_winidn_path" != "default"; then + dnl path has been specified + dnl pkg-config not available or provides no info + WINIDN_LDFLAGS="-L$want_winidn_path/lib$libsuff" + WINIDN_CPPFLAGS="-I$want_winidn_path/include" + WINIDN_DIR="$want_winidn_path/lib$libsuff" + fi + # + CPPFLAGS="$CPPFLAGS $WINIDN_CPPFLAGS" + LDFLAGS="$LDFLAGS $WINIDN_LDFLAGS" + LIBS="$WINIDN_LIBS $LIBS" + # + AC_MSG_CHECKING([if IdnToUnicode can be linked]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + #include + ]],[[ + IdnToUnicode(0, NULL, 0, NULL, 0); + ]]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_winidn="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_winidn="no" + ]) + # + if test "$tst_links_winidn" = "yes"; then + AC_DEFINE(USE_WIN32_IDN, 1, [Define to 1 if you have the `normaliz' (WinIDN) library (-lnormaliz).]) + AC_DEFINE(WANT_IDN_PROTOTYPES, 1, [Define to 1 to provide own prototypes.]) + AC_SUBST([IDN_ENABLED], [1]) + curl_idn_msg="enabled (Windows-native)" + else + AC_MSG_WARN([Cannot find libraries for IDN support: IDN disabled]) + CPPFLAGS="$clean_CPPFLAGS" + LDFLAGS="$clean_LDFLAGS" + LIBS="$clean_LIBS" + fi +fi + +dnl ********************************************************************** +dnl Check for the presence of IDN libraries and headers +dnl ********************************************************************** + +AC_MSG_CHECKING([whether to build with libidn2]) +OPT_IDN="default" +AC_ARG_WITH(libidn2, +AC_HELP_STRING([--with-libidn2=PATH],[Enable libidn2 usage]) +AC_HELP_STRING([--without-libidn2],[Disable libidn2 usage]), + [OPT_IDN=$withval]) +case "$OPT_IDN" in + no) + dnl --without-libidn2 option used + want_idn="no" + AC_MSG_RESULT([no]) + ;; + default) + dnl configure option not specified + want_idn="yes" + want_idn_path="default" + AC_MSG_RESULT([(assumed) yes]) + ;; + yes) + dnl --with-libidn2 option used without path + want_idn="yes" + want_idn_path="default" + AC_MSG_RESULT([yes]) + ;; + *) + dnl --with-libidn2 option used with path + want_idn="yes" + want_idn_path="$withval" + AC_MSG_RESULT([yes ($withval)]) + ;; +esac + +if test "$want_idn" = "yes"; then + dnl idn library support has been requested + clean_CPPFLAGS="$CPPFLAGS" + clean_LDFLAGS="$LDFLAGS" + clean_LIBS="$LIBS" + PKGCONFIG="no" + # + if test "$want_idn_path" != "default"; then + dnl path has been specified + IDN_PCDIR="$want_idn_path/lib$libsuff/pkgconfig" + CURL_CHECK_PKGCONFIG(libidn2, [$IDN_PCDIR]) + if test "$PKGCONFIG" != "no"; then + IDN_LIBS=`CURL_EXPORT_PCDIR([$IDN_PCDIR]) dnl + $PKGCONFIG --libs-only-l libidn2 2>/dev/null` + IDN_LDFLAGS=`CURL_EXPORT_PCDIR([$IDN_PCDIR]) dnl + $PKGCONFIG --libs-only-L libidn2 2>/dev/null` + IDN_CPPFLAGS=`CURL_EXPORT_PCDIR([$IDN_PCDIR]) dnl + $PKGCONFIG --cflags-only-I libidn2 2>/dev/null` + IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'` + else + dnl pkg-config not available or provides no info + IDN_LIBS="-lidn2" + IDN_LDFLAGS="-L$want_idn_path/lib$libsuff" + IDN_CPPFLAGS="-I$want_idn_path/include" + IDN_DIR="$want_idn_path/lib$libsuff" + fi + else + dnl path not specified + CURL_CHECK_PKGCONFIG(libidn2) + if test "$PKGCONFIG" != "no"; then + IDN_LIBS=`$PKGCONFIG --libs-only-l libidn2 2>/dev/null` + IDN_LDFLAGS=`$PKGCONFIG --libs-only-L libidn2 2>/dev/null` + IDN_CPPFLAGS=`$PKGCONFIG --cflags-only-I libidn2 2>/dev/null` + IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'` + else + dnl pkg-config not available or provides no info + IDN_LIBS="-lidn2" + fi + fi + # + if test "$PKGCONFIG" != "no"; then + AC_MSG_NOTICE([pkg-config: IDN_LIBS: "$IDN_LIBS"]) + AC_MSG_NOTICE([pkg-config: IDN_LDFLAGS: "$IDN_LDFLAGS"]) + AC_MSG_NOTICE([pkg-config: IDN_CPPFLAGS: "$IDN_CPPFLAGS"]) + AC_MSG_NOTICE([pkg-config: IDN_DIR: "$IDN_DIR"]) + else + AC_MSG_NOTICE([IDN_LIBS: "$IDN_LIBS"]) + AC_MSG_NOTICE([IDN_LDFLAGS: "$IDN_LDFLAGS"]) + AC_MSG_NOTICE([IDN_CPPFLAGS: "$IDN_CPPFLAGS"]) + AC_MSG_NOTICE([IDN_DIR: "$IDN_DIR"]) + fi + # + CPPFLAGS="$CPPFLAGS $IDN_CPPFLAGS" + LDFLAGS="$LDFLAGS $IDN_LDFLAGS" + LIBS="$IDN_LIBS $LIBS" + # + AC_MSG_CHECKING([if idn2_lookup_ul can be linked]) + AC_LINK_IFELSE([ + AC_LANG_FUNC_LINK_TRY([idn2_lookup_ul]) + ],[ + AC_MSG_RESULT([yes]) + tst_links_libidn="yes" + ],[ + AC_MSG_RESULT([no]) + tst_links_libidn="no" + ]) + # + AC_CHECK_HEADERS( idn2.h ) + + if test "$tst_links_libidn" = "yes"; then + AC_DEFINE(HAVE_LIBIDN2, 1, [Define to 1 if you have the `idn2' library (-lidn2).]) + dnl different versions of libidn have different setups of these: + + AC_SUBST([IDN_ENABLED], [1]) + curl_idn_msg="enabled (libidn2)" + if test -n "$IDN_DIR" -a "x$cross_compiling" != "xyes"; then + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$IDN_DIR" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $IDN_DIR to CURL_LIBRARY_PATH]) + fi + else + AC_MSG_WARN([Cannot find libraries for IDN support: IDN disabled]) + CPPFLAGS="$clean_CPPFLAGS" + LDFLAGS="$clean_LDFLAGS" + LIBS="$clean_LIBS" + fi +fi + + +dnl Let's hope this split URL remains working: +dnl https://www15.software.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \ +dnl genprogc/thread_quick_ref.htm + + +dnl ********************************************************************** +dnl Check for nghttp2 +dnl ********************************************************************** + +OPT_H2="yes" + +if test "x$disable_http" = "xyes"; then + # without HTTP, nghttp2 is no use + OPT_H2="no" +fi + +AC_ARG_WITH(nghttp2, +AC_HELP_STRING([--with-nghttp2=PATH],[Enable nghttp2 usage]) +AC_HELP_STRING([--without-nghttp2],[Disable nghttp2 usage]), + [OPT_H2=$withval]) +case "$OPT_H2" in + no) + dnl --without-nghttp2 option used + want_h2="no" + ;; + yes) + dnl --with-nghttp2 option used without path + want_h2="default" + want_h2_path="" + ;; + *) + dnl --with-nghttp2 option used with path + want_h2="yes" + want_h2_path="$withval/lib/pkgconfig" + ;; +esac + +curl_h2_msg="disabled (--with-nghttp2)" +if test X"$want_h2" != Xno; then + dnl backup the pre-nghttp2 variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + CURL_CHECK_PKGCONFIG(libnghttp2, $want_h2_path) + + if test "$PKGCONFIG" != "no" ; then + LIB_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) + $PKGCONFIG --libs-only-l libnghttp2` + AC_MSG_NOTICE([-l is $LIB_H2]) + + CPP_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) dnl + $PKGCONFIG --cflags-only-I libnghttp2` + AC_MSG_NOTICE([-I is $CPP_H2]) + + LD_H2=`CURL_EXPORT_PCDIR([$want_h2_path]) + $PKGCONFIG --libs-only-L libnghttp2` + AC_MSG_NOTICE([-L is $LD_H2]) + + LDFLAGS="$LDFLAGS $LD_H2" + CPPFLAGS="$CPPFLAGS $CPP_H2" + LIBS="$LIB_H2 $LIBS" + + # use nghttp2_session_set_local_window_size to require nghttp2 + # >= 1.12.0 + AC_CHECK_LIB(nghttp2, nghttp2_session_set_local_window_size, + [ + AC_CHECK_HEADERS(nghttp2/nghttp2.h, + curl_h2_msg="enabled (nghttp2)" + NGHTTP2_ENABLED=1 + AC_DEFINE(USE_NGHTTP2, 1, [if nghttp2 is in use]) + AC_SUBST(USE_NGHTTP2, [1]) + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + + else + dnl no nghttp2 pkg-config found, deal with it + if test X"$want_h2" != Xdefault; then + dnl To avoid link errors, we do not allow --with-nghttp2 without + dnl a pkgconfig file + AC_MSG_ERROR([--with-nghttp2 was specified but could not find libnghttp2 pkg-config file.]) + fi + fi + +fi + +dnl ********************************************************************** +dnl Check for ngtcp2 (QUIC) +dnl ********************************************************************** + +OPT_TCP2="yes" +curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)" + +if test "x$disable_http" = "xyes"; then + # without HTTP, ngtcp2 is no use + OPT_TCP2="no" +fi + +AC_ARG_WITH(ngtcp2, +AC_HELP_STRING([--with-ngtcp2=PATH],[Enable ngtcp2 usage]) +AC_HELP_STRING([--without-ngtcp2],[Disable ngtcp2 usage]), + [OPT_TCP2=$withval]) +case "$OPT_TCP2" in + no) + dnl --without-ngtcp2 option used + want_tcp2="no" + ;; + yes) + dnl --with-ngtcp2 option used without path + want_tcp2="default" + want_tcp2_path="" + ;; + *) + dnl --with-ngtcp2 option used with path + want_tcp2="yes" + want_tcp2_path="$withval/lib/pkgconfig" + ;; +esac + +curl_tcp2_msg="disabled (--with-ngtcp2)" +if test X"$want_tcp2" != Xno; then + dnl backup the pre-ngtcp2 variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + CURL_CHECK_PKGCONFIG(libngtcp2, $want_tcp2_path) + + if test "$PKGCONFIG" != "no" ; then + LIB_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) + $PKGCONFIG --libs-only-l libngtcp2` + AC_MSG_NOTICE([-l is $LIB_TCP2]) + + CPP_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl + $PKGCONFIG --cflags-only-I libngtcp2` + AC_MSG_NOTICE([-I is $CPP_TCP2]) + + LD_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) + $PKGCONFIG --libs-only-L libngtcp2` + AC_MSG_NOTICE([-L is $LD_TCP2]) + + LDFLAGS="$LDFLAGS $LD_TCP2" + CPPFLAGS="$CPPFLAGS $CPP_TCP2" + LIBS="$LIB_TCP2 $LIBS" + + if test "x$cross_compiling" != "xyes"; then + DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'` + fi + AC_CHECK_LIB(ngtcp2, ngtcp2_conn_client_new, + [ + AC_CHECK_HEADERS(ngtcp2/ngtcp2.h, + NGTCP2_ENABLED=1 + AC_DEFINE(USE_NGTCP2, 1, [if ngtcp2 is in use]) + AC_SUBST(USE_NGTCP2, [1]) + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_TCP2 to CURL_LIBRARY_PATH]) + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + + else + dnl no ngtcp2 pkg-config found, deal with it + if test X"$want_tcp2" != Xdefault; then + dnl To avoid link errors, we do not allow --with-ngtcp2 without + dnl a pkgconfig file + AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file.]) + fi + fi + +fi + +if test "x$NGTCP2_ENABLED" = "x1"; then + dnl backup the pre-ngtcp2_crypto_openssl variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + CURL_CHECK_PKGCONFIG(libngtcp2_crypto_openssl, $want_tcp2_path) + + if test "$PKGCONFIG" != "no" ; then + LIB_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) + $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl` + AC_MSG_NOTICE([-l is $LIB_NGTCP2_CRYPTO_OPENSSL]) + + CPP_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl + $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl` + AC_MSG_NOTICE([-I is $CPP_NGTCP2_CRYPTO_OPENSSL]) + + LD_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) + $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl` + AC_MSG_NOTICE([-L is $LD_NGTCP2_CRYPTO_OPENSSL]) + + LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL" + CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL" + LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS" + + if test "x$cross_compiling" != "xyes"; then + DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'` + fi + AC_CHECK_LIB(ngtcp2_crypto_openssl, ngtcp2_crypto_ctx_initial, + [ + AC_CHECK_HEADERS(ngtcp2/ngtcp2_crypto.h, + NGTCP2_ENABLED=1 + AC_DEFINE(USE_NGTCP2_CRYPTO_OPENSSL, 1, [if ngtcp2_crypto_openssl is in use]) + AC_SUBST(USE_NGTCP2_CRYPTO_OPENSSL, [1]) + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH]) + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + + else + dnl no ngtcp2_crypto_openssl pkg-config found, deal with it + if test X"$want_tcp2" != Xdefault; then + dnl To avoid link errors, we do not allow --with-ngtcp2 without + dnl a pkgconfig file + AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file.]) + fi + fi +fi + +dnl ********************************************************************** +dnl Check for nghttp3 (HTTP/3 with ngtcp2) +dnl ********************************************************************** + +OPT_NGHTTP3="yes" + +if test "x$NGTCP2_ENABLED" = "x"; then + # without ngtcp2, nghttp3 is of no use for us + OPT_NGHTTP3="no" +fi + +AC_ARG_WITH(nghttp3, +AC_HELP_STRING([--with-nghttp3=PATH],[Enable nghttp3 usage]) +AC_HELP_STRING([--without-nghttp3],[Disable nghttp3 usage]), + [OPT_NGHTTP3=$withval]) +case "$OPT_NGHTTP3" in + no) + dnl --without-nghttp3 option used + want_nghttp3="no" + ;; + yes) + dnl --with-nghttp3 option used without path + want_nghttp3="default" + want_nghttp3_path="" + ;; + *) + dnl --with-nghttp3 option used with path + want_nghttp3="yes" + want_nghttp3_path="$withval/lib/pkgconfig" + ;; +esac + +curl_http3_msg="disabled (--with-nghttp3)" +if test X"$want_nghttp3" != Xno; then + dnl backup the pre-nghttp3 variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + CURL_CHECK_PKGCONFIG(libnghttp3, $want_nghttp3_path) + + if test "$PKGCONFIG" != "no" ; then + LIB_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) + $PKGCONFIG --libs-only-l libnghttp3` + AC_MSG_NOTICE([-l is $LIB_NGHTTP3]) + + CPP_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) dnl + $PKGCONFIG --cflags-only-I libnghttp3` + AC_MSG_NOTICE([-I is $CPP_NGHTTP3]) + + LD_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) + $PKGCONFIG --libs-only-L libnghttp3` + AC_MSG_NOTICE([-L is $LD_NGHTTP3]) + + LDFLAGS="$LDFLAGS $LD_NGHTTP3" + CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3" + LIBS="$LIB_NGHTTP3 $LIBS" + + if test "x$cross_compiling" != "xyes"; then + DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'` + fi + AC_CHECK_LIB(nghttp3, nghttp3_conn_client_new, + [ + AC_CHECK_HEADERS(nghttp3/nghttp3.h, + curl_h3_msg="enabled (ngtcp2 + nghttp3)" + NGHTTP3_ENABLED=1 + AC_DEFINE(USE_NGHTTP3, 1, [if nghttp3 is in use]) + AC_SUBST(USE_NGHTTP3, [1]) + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH]) + experimental="$experimental HTTP3" + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + + else + dnl no nghttp3 pkg-config found, deal with it + if test X"$want_nghttp3" != Xdefault; then + dnl To avoid link errors, we do not allow --with-nghttp3 without + dnl a pkgconfig file + AC_MSG_ERROR([--with-nghttp3 was specified but could not find nghttp3 pkg-config file.]) + fi + fi + +fi + +dnl ********************************************************************** +dnl Check for quiche (QUIC) +dnl ********************************************************************** + +OPT_QUICHE="yes" + +if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then + # without HTTP or with ngtcp2, quiche is no use + OPT_QUICHE="no" +fi + +AC_ARG_WITH(quiche, +AC_HELP_STRING([--with-quiche=PATH],[Enable quiche usage]) +AC_HELP_STRING([--without-quiche],[Disable quiche usage]), + [OPT_QUICHE=$withval]) +case "$OPT_QUICHE" in + no) + dnl --without-quiche option used + want_quiche="no" + ;; + yes) + dnl --with-quiche option used without path + want_quiche="default" + want_quiche_path="" + ;; + *) + dnl --with-quiche option used with path + want_quiche="yes" + want_quiche_path="$withval" + ;; +esac + +if test X"$want_quiche" != Xno; then + dnl backup the pre-quiche variables + CLEANLDFLAGS="$LDFLAGS" + CLEANCPPFLAGS="$CPPFLAGS" + CLEANLIBS="$LIBS" + + CURL_CHECK_PKGCONFIG(quiche, $want_quiche_path) + + if test "$PKGCONFIG" != "no" ; then + LIB_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) + $PKGCONFIG --libs-only-l quiche` + AC_MSG_NOTICE([-l is $LIB_QUICHE]) + + CPP_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) dnl + $PKGCONFIG --cflags-only-I quiche` + AC_MSG_NOTICE([-I is $CPP_QUICHE]) + + LD_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) + $PKGCONFIG --libs-only-L quiche` + AC_MSG_NOTICE([-L is $LD_QUICHE]) + + LDFLAGS="$LDFLAGS $LD_QUICHE" + CPPFLAGS="$CPPFLAGS $CPP_QUICHE" + LIBS="$LIB_QUICHE $LIBS" + + if test "x$cross_compiling" != "xyes"; then + DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'` + fi + AC_CHECK_LIB(quiche, quiche_connect, + [ + AC_CHECK_HEADERS(quiche.h, + experimental="$experimental HTTP3" + AC_MSG_NOTICE([HTTP3 support is experimental]) + curl_h3_msg="enabled (quiche)" + QUICHE_ENABLED=1 + AC_DEFINE(USE_QUICHE, 1, [if quiche is in use]) + AC_SUBST(USE_QUICHE, [1]) + CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE" + export CURL_LIBRARY_PATH + AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]), + ) + ], + dnl not found, revert back to clean variables + LDFLAGS=$CLEANLDFLAGS + CPPFLAGS=$CLEANCPPFLAGS + LIBS=$CLEANLIBS + ) + else + dnl no quiche pkg-config found, deal with it + if test X"$want_quiche" != Xdefault; then + dnl To avoid link errors, we do not allow --with-quiche without + dnl a pkgconfig file + AC_MSG_ERROR([--with-quiche was specified but could not find quiche pkg-config file.]) + fi + fi +fi + +dnl ********************************************************************** +dnl Check for zsh completion path +dnl ********************************************************************** + +OPT_ZSH_FPATH=default +AC_ARG_WITH(zsh-functions-dir, +AC_HELP_STRING([--with-zsh-functions-dir=PATH],[Install zsh completions to PATH]) +AC_HELP_STRING([--without-zsh-functions-dir],[Do not install zsh completions]), + [OPT_ZSH_FPATH=$withval]) +case "$OPT_ZSH_FPATH" in + no) + dnl --without-zsh-functions-dir option used + ;; + default|yes) + dnl --with-zsh-functions-dir option used without path + ZSH_FUNCTIONS_DIR="$datarootdir/zsh/site-functions" + AC_SUBST(ZSH_FUNCTIONS_DIR) + ;; + *) + dnl --with-zsh-functions-dir option used with path + ZSH_FUNCTIONS_DIR="$withval" + AC_SUBST(ZSH_FUNCTIONS_DIR) + ;; +esac + +dnl ********************************************************************** +dnl Check for fish completion path +dnl ********************************************************************** + +OPT_FISH_FPATH=default +AC_ARG_WITH(fish-functions-dir, +AC_HELP_STRING([--with-fish-functions-dir=PATH],[Install fish completions to PATH]) +AC_HELP_STRING([--without-fish-functions-dir],[Do not install fish completions]), + [OPT_FISH_FPATH=$withval]) +case "$OPT_FISH_FPATH" in + no) + dnl --without-fish-functions-dir option used + ;; + default|yes) + dnl --with-fish-functions-dir option used without path + CURL_CHECK_PKGCONFIG(fish) + if test "$PKGCONFIG" != "no" ; then + FISH_FUNCTIONS_DIR="$($PKGCONFIG --variable completionsdir fish)" + else + FISH_FUNCTIONS_DIR="$datarootdir/fish/vendor_completions.d" + fi + AC_SUBST(FISH_FUNCTIONS_DIR) + ;; + *) + dnl --with-fish-functions-dir option used with path + FISH_FUNCTIONS_DIR="$withval" + AC_SUBST(FISH_FUNCTIONS_DIR) + ;; +esac + +dnl ********************************************************************** +dnl Back to "normal" configuring +dnl ********************************************************************** + +dnl Checks for header files. +AC_HEADER_STDC + +CURL_CHECK_HEADER_MALLOC +CURL_CHECK_HEADER_MEMORY + +dnl Now check for the very most basic headers. Then we can use these +dnl ones as default-headers when checking for the rest! +AC_CHECK_HEADERS( + sys/types.h \ + sys/time.h \ + sys/select.h \ + sys/socket.h \ + sys/ioctl.h \ + sys/uio.h \ + assert.h \ + unistd.h \ + stdlib.h \ + arpa/inet.h \ + net/if.h \ + netinet/in.h \ + netinet/in6.h \ + sys/un.h \ + linux/tcp.h \ + netinet/tcp.h \ + netdb.h \ + sys/sockio.h \ + sys/stat.h \ + sys/param.h \ + termios.h \ + termio.h \ + sgtty.h \ + fcntl.h \ + alloca.h \ + time.h \ + io.h \ + pwd.h \ + utime.h \ + sys/utime.h \ + sys/poll.h \ + poll.h \ + socket.h \ + sys/resource.h \ + libgen.h \ + locale.h \ + errno.h \ + stdbool.h \ + arpa/tftp.h \ + sys/filio.h \ + sys/wait.h \ + setjmp.h, +dnl to do if not found +[], +dnl to do if found +[], +dnl default includes +[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +] +) + + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +CURL_CHECK_VARIADIC_MACROS +AC_TYPE_SIZE_T +AC_HEADER_TIME +CURL_CHECK_STRUCT_TIMEVAL +CURL_VERIFY_RUNTIMELIBS + +AX_COMPILE_CHECK_SIZEOF(size_t) +AX_COMPILE_CHECK_SIZEOF(long) +AX_COMPILE_CHECK_SIZEOF(int) +AX_COMPILE_CHECK_SIZEOF(short) +AX_COMPILE_CHECK_SIZEOF(time_t) +AX_COMPILE_CHECK_SIZEOF(off_t) + +o=$CPPFLAGS +CPPFLAGS="-I$srcdir/include $CPPFLAGS" +AX_COMPILE_CHECK_SIZEOF(curl_off_t, [ +#include +]) +CPPFLAGS=$o + +AC_CHECK_TYPE(long long, + [AC_DEFINE(HAVE_LONGLONG, 1, + [Define to 1 if the compiler supports the 'long long' data type.])] + longlong="yes" +) + +if test "xyes" = "x$longlong"; then + AC_MSG_CHECKING([if numberLL works]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + long long val = 1000LL; + ]]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL]) + ],[ + AC_MSG_RESULT([no]) + ]) +fi + + +# check for ssize_t +AC_CHECK_TYPE(ssize_t, , + AC_DEFINE(ssize_t, int, [the signed version of size_t])) + +# check for bool type +AC_CHECK_TYPE([bool],[ + AC_DEFINE(HAVE_BOOL_T, 1, + [Define to 1 if bool is an available type.]) +], ,[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDBOOL_H +#include +#endif +]) + +# check for sa_family_t +AC_CHECK_TYPE(sa_family_t, + AC_DEFINE(CURL_SA_FAMILY_T, sa_family_t, [IP address type in sockaddr]), + [ + # The windows name? + AC_CHECK_TYPE(ADDRESS_FAMILY, + AC_DEFINE(CURL_SA_FAMILY_T, ADDRESS_FAMILY, [IP address type in sockaddr]), + AC_DEFINE(CURL_SA_FAMILY_T, unsigned short, [IP address type in sockaddr]), + [ +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + ]) + ], +[ +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +]) + +AC_MSG_CHECKING([if time_t is unsigned]) +CURL_RUN_IFELSE( + [ + #include + #include + time_t t = -1; + return (t > 0); + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_TIME_T_UNSIGNED, 1, [Define this if time_t is unsigned]) +],[ + AC_MSG_RESULT([no]) +],[ + dnl cross-compiling, most systems are unsigned + AC_MSG_RESULT([no]) +]) + +CURL_CONFIGURE_PULL_SYS_POLL + +TYPE_IN_ADDR_T + +TYPE_SOCKADDR_STORAGE + +TYPE_SIG_ATOMIC_T + +AC_TYPE_SIGNAL + +CURL_CHECK_FUNC_SELECT + +CURL_CHECK_FUNC_RECV +CURL_CHECK_FUNC_SEND +CURL_CHECK_MSG_NOSIGNAL + +CURL_CHECK_FUNC_ALARM +CURL_CHECK_FUNC_BASENAME +CURL_CHECK_FUNC_CLOSESOCKET +CURL_CHECK_FUNC_CLOSESOCKET_CAMEL +CURL_CHECK_FUNC_CONNECT +CURL_CHECK_FUNC_FCNTL +CURL_CHECK_FUNC_FREEADDRINFO +CURL_CHECK_FUNC_FREEIFADDRS +CURL_CHECK_FUNC_FSETXATTR +CURL_CHECK_FUNC_FTRUNCATE +CURL_CHECK_FUNC_GETADDRINFO +CURL_CHECK_FUNC_GAI_STRERROR +CURL_CHECK_FUNC_GETHOSTBYADDR +CURL_CHECK_FUNC_GETHOSTBYADDR_R +CURL_CHECK_FUNC_GETHOSTBYNAME +CURL_CHECK_FUNC_GETHOSTBYNAME_R +CURL_CHECK_FUNC_GETHOSTNAME +CURL_CHECK_FUNC_GETPEERNAME +CURL_CHECK_FUNC_GETSOCKNAME +CURL_CHECK_FUNC_IF_NAMETOINDEX +CURL_CHECK_FUNC_GETIFADDRS +CURL_CHECK_FUNC_GETSERVBYPORT_R +CURL_CHECK_FUNC_GMTIME_R +CURL_CHECK_FUNC_INET_NTOA_R +CURL_CHECK_FUNC_INET_NTOP +CURL_CHECK_FUNC_INET_PTON +CURL_CHECK_FUNC_IOCTL +CURL_CHECK_FUNC_IOCTLSOCKET +CURL_CHECK_FUNC_IOCTLSOCKET_CAMEL +CURL_CHECK_FUNC_LOCALTIME_R +CURL_CHECK_FUNC_MEMRCHR +CURL_CHECK_FUNC_POLL +CURL_CHECK_FUNC_SETSOCKOPT +CURL_CHECK_FUNC_SIGACTION +CURL_CHECK_FUNC_SIGINTERRUPT +CURL_CHECK_FUNC_SIGNAL +CURL_CHECK_FUNC_SIGSETJMP +CURL_CHECK_FUNC_SOCKET +CURL_CHECK_FUNC_SOCKETPAIR +CURL_CHECK_FUNC_STRCASECMP +CURL_CHECK_FUNC_STRCMPI +CURL_CHECK_FUNC_STRDUP +CURL_CHECK_FUNC_STRERROR_R +CURL_CHECK_FUNC_STRICMP +CURL_CHECK_FUNC_STRNCASECMP +CURL_CHECK_FUNC_STRNCMPI +CURL_CHECK_FUNC_STRNICMP +CURL_CHECK_FUNC_STRSTR +CURL_CHECK_FUNC_STRTOK_R +CURL_CHECK_FUNC_STRTOLL +CURL_CHECK_FUNC_WRITEV + +case $host in + *msdosdjgpp) + ac_cv_func_pipe=no + skipcheck_pipe=yes + AC_MSG_NOTICE([skip check for pipe on msdosdjgpp]) + ;; +esac + +AC_CHECK_DECLS([getpwuid_r], [], [AC_DEFINE(HAVE_DECL_GETPWUID_R_MISSING, 1, "Set if getpwuid_r() declaration is missing")], + [[#include + #include ]]) + + +AC_CHECK_FUNCS([fnmatch \ + geteuid \ + getpass_r \ + getppid \ + getpwuid \ + getpwuid_r \ + getrlimit \ + gettimeofday \ + if_nametoindex \ + mach_absolute_time \ + pipe \ + setlocale \ + setmode \ + setrlimit \ + usleep \ + utime \ + utimes +],[ +],[ + func="$ac_func" + eval skipcheck=\$skipcheck_$func + if test "x$skipcheck" != "xyes"; then + AC_MSG_CHECKING([deeper for $func]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + ]],[[ + $func (); + ]]) + ],[ + AC_MSG_RESULT([yes]) + eval "ac_cv_func_$func=yes" + AC_DEFINE_UNQUOTED(XC_SH_TR_CPP([HAVE_$func]), [1], + [Define to 1 if you have the $func function.]) + ],[ + AC_MSG_RESULT([but still no]) + ]) + fi +]) + +CURL_CHECK_NONBLOCKING_SOCKET + +dnl ************************************************************ +dnl nroff tool stuff +dnl + +AC_PATH_PROG( PERL, perl, , + $PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin ) +AC_SUBST(PERL) + +AC_PATH_PROGS( NROFF, gnroff nroff, , + $PATH:/usr/bin/:/usr/local/bin ) +AC_SUBST(NROFF) + +if test -n "$NROFF"; then + dnl only check for nroff options if an nroff command was found + + AC_MSG_CHECKING([how to use *nroff to get plain text from man pages]) + MANOPT="-man" + mancheck=`echo foo | $NROFF $MANOPT 2>/dev/null` + if test -z "$mancheck"; then + MANOPT="-mandoc" + mancheck=`echo foo | $NROFF $MANOPT 2>/dev/null` + if test -z "$mancheck"; then + MANOPT="" + AC_MSG_RESULT([failed]) + AC_MSG_WARN([found no *nroff option to get plaintext from man pages]) + else + AC_MSG_RESULT([$MANOPT]) + fi + else + AC_MSG_RESULT([$MANOPT]) + fi + AC_SUBST(MANOPT) +fi + +if test -z "$MANOPT" +then + dnl if no nroff tool was found, or no option that could convert man pages + dnl was found, then disable the built-in manual stuff + AC_MSG_WARN([disabling built-in manual]) + USE_MANUAL="no"; +fi + +dnl ************************************************************************* +dnl If the manual variable still is set, then we go with providing a built-in +dnl manual + +if test "$USE_MANUAL" = "1"; then + AC_DEFINE(USE_MANUAL, 1, [If you want to build curl with the built-in manual]) + curl_manual_msg="enabled" +fi + +dnl set variable for use in automakefile(s) +AM_CONDITIONAL(USE_MANUAL, test x"$USE_MANUAL" = x1) + +CURL_CHECK_LIB_ARES +AM_CONDITIONAL(USE_EMBEDDED_ARES, test x$embedded_ares = xyes) + +if test "x$curl_cv_native_windows" != "xyes" && + test "x$enable_shared" = "xyes"; then + build_libhostname=yes +else + build_libhostname=no +fi +AM_CONDITIONAL(BUILD_LIBHOSTNAME, test x$build_libhostname = xyes) + +if test "x$want_ares" != xyes; then + CURL_CHECK_OPTION_THREADED_RESOLVER +fi + +dnl ************************************************************ +dnl disable POSIX threads +dnl +AC_MSG_CHECKING([whether to use POSIX threads for threaded resolver]) +AC_ARG_ENABLE(pthreads, +AC_HELP_STRING([--enable-pthreads], + [Enable POSIX threads (default for threaded resolver)]) +AC_HELP_STRING([--disable-pthreads],[Disable POSIX threads]), +[ case "$enableval" in + no) AC_MSG_RESULT(no) + want_pthreads=no + ;; + *) AC_MSG_RESULT(yes) + want_pthreads=yes + ;; + esac ], [ + AC_MSG_RESULT(auto) + want_pthreads=auto + ] +) + +dnl turn off pthreads if rt is disabled +if test "$want_pthreads" != "no"; then + if test "$want_pthreads" = "yes" && test "$dontwant_rt" = "yes"; then + AC_MSG_ERROR([options --enable-pthreads and --disable-rt are mutually exclusive]) + fi + if test "$dontwant_rt" != "no"; then + dnl if --enable-pthreads was explicit then warn it's being ignored + if test "$want_pthreads" = "yes"; then + AC_MSG_WARN([--enable-pthreads Ignored since librt is disabled.]) + fi + want_pthreads=no + fi +fi + +dnl turn off pthreads if no threaded resolver +if test "$want_pthreads" != "no" && test "$want_thres" != "yes"; then + want_pthreads=no +fi + +dnl detect pthreads +if test "$want_pthreads" != "no"; then + AC_CHECK_HEADER(pthread.h, + [ AC_DEFINE(HAVE_PTHREAD_H, 1, [if you have ]) + save_CFLAGS="$CFLAGS" + + dnl first check for function without lib + AC_CHECK_FUNC(pthread_create, [USE_THREADS_POSIX=1] ) + + dnl on HPUX, life is more complicated... + case $host in + *-hp-hpux*) + dnl it doesn't actually work without -lpthread + USE_THREADS_POSIX="" + ;; + *) + ;; + esac + + dnl if it wasn't found without lib, search for it in pthread lib + if test "$USE_THREADS_POSIX" != "1" + then + CFLAGS="$CFLAGS -pthread" + AC_CHECK_LIB(pthread, pthread_create, + [USE_THREADS_POSIX=1], + [ CFLAGS="$save_CFLAGS"]) + fi + + if test "x$USE_THREADS_POSIX" = "x1" + then + AC_DEFINE(USE_THREADS_POSIX, 1, [if you want POSIX threaded DNS lookup]) + curl_res_msg="POSIX threaded" + fi + ]) +fi + +dnl threaded resolver check +if test "$want_thres" = "yes" && test "x$USE_THREADS_POSIX" != "x1"; then + if test "$want_pthreads" = "yes"; then + AC_MSG_ERROR([--enable-pthreads but pthreads was not found]) + fi + dnl If native Windows fallback on Win32 threads since no POSIX threads + if test "$curl_cv_native_windows" = "yes"; then + USE_THREADS_WIN32=1 + AC_DEFINE(USE_THREADS_WIN32, 1, [if you want Win32 threaded DNS lookup]) + curl_res_msg="Win32 threaded" + else + AC_MSG_ERROR([Threaded resolver enabled but no thread library found]) + fi +fi + +dnl ************************************************************ +dnl disable verbose text strings +dnl +AC_MSG_CHECKING([whether to enable verbose strings]) +AC_ARG_ENABLE(verbose, +AC_HELP_STRING([--enable-verbose],[Enable verbose strings]) +AC_HELP_STRING([--disable-verbose],[Disable verbose strings]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_VERBOSE_STRINGS, 1, [to disable verbose strings]) + curl_verbose_msg="no" + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl enable SSPI support +dnl +AC_MSG_CHECKING([whether to enable SSPI support (Windows native builds only)]) +AC_ARG_ENABLE(sspi, +AC_HELP_STRING([--enable-sspi],[Enable SSPI]) +AC_HELP_STRING([--disable-sspi],[Disable SSPI]), +[ case "$enableval" in + yes) + if test "$curl_cv_native_windows" = "yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) + AC_SUBST(USE_WINDOWS_SSPI, [1]) + curl_sspi_msg="enabled" + else + AC_MSG_RESULT(no) + AC_MSG_WARN([--enable-sspi Ignored. Only supported on native Windows builds.]) + fi + ;; + *) + if test "x$WINSSL_ENABLED" = "x1"; then + # --with-winssl implies --enable-sspi + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + ;; + esac ], + if test "x$WINSSL_ENABLED" = "x1"; then + # --with-winssl implies --enable-sspi + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi +) + +dnl ************************************************************ +dnl disable cryptographic authentication +dnl +AC_MSG_CHECKING([whether to enable cryptographic authentication methods]) +AC_ARG_ENABLE(crypto-auth, +AC_HELP_STRING([--enable-crypto-auth],[Enable cryptographic authentication]) +AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication]) + CURL_DISABLE_CRYPTO_AUTH=1 + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +CURL_CHECK_OPTION_NTLM_WB + +CURL_CHECK_NTLM_WB + +dnl ************************************************************ +dnl disable TLS-SRP authentication +dnl +AC_MSG_CHECKING([whether to enable TLS-SRP authentication]) +AC_ARG_ENABLE(tls-srp, +AC_HELP_STRING([--enable-tls-srp],[Enable TLS-SRP authentication]) +AC_HELP_STRING([--disable-tls-srp],[Disable TLS-SRP authentication]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + want_tls_srp=no + ;; + *) AC_MSG_RESULT(yes) + want_tls_srp=yes + ;; + esac ], + AC_MSG_RESULT(yes) + want_tls_srp=yes +) + +if test "$want_tls_srp" = "yes" && ( test "x$HAVE_GNUTLS_SRP" = "x1" || test "x$HAVE_OPENSSL_SRP" = "x1") ; then + AC_DEFINE(USE_TLS_SRP, 1, [Use TLS-SRP authentication]) + USE_TLS_SRP=1 + curl_tls_srp_msg="enabled" +fi + +dnl ************************************************************ +dnl disable Unix domain sockets support +dnl +AC_MSG_CHECKING([whether to enable Unix domain sockets]) +AC_ARG_ENABLE(unix-sockets, +AC_HELP_STRING([--enable-unix-sockets],[Enable Unix domain sockets]) +AC_HELP_STRING([--disable-unix-sockets],[Disable Unix domain sockets]), +[ case "$enableval" in + no) AC_MSG_RESULT(no) + want_unix_sockets=no + ;; + *) AC_MSG_RESULT(yes) + want_unix_sockets=yes + ;; + esac ], [ + AC_MSG_RESULT(auto) + want_unix_sockets=auto + ] +) +if test "x$want_unix_sockets" != "xno"; then + AC_CHECK_MEMBER([struct sockaddr_un.sun_path], [ + AC_DEFINE(USE_UNIX_SOCKETS, 1, [Use Unix domain sockets]) + AC_SUBST(USE_UNIX_SOCKETS, [1]) + curl_unix_sockets_msg="enabled" + ], [ + if test "x$want_unix_sockets" = "xyes"; then + AC_MSG_ERROR([--enable-unix-sockets is not available on this platform!]) + fi + ], [ + #include + ]) +fi + +dnl ************************************************************ +dnl disable cookies support +dnl +AC_MSG_CHECKING([whether to support cookies]) +AC_ARG_ENABLE(cookies, +AC_HELP_STRING([--enable-cookies],[Enable cookies support]) +AC_HELP_STRING([--disable-cookies],[Disable cookies support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_COOKIES, 1, [to disable cookies support]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable HTTP authentication support +dnl +AC_MSG_CHECKING([whether to support HTTP authentication]) +AC_ARG_ENABLE(http-auth, +AC_HELP_STRING([--enable-http-auth],[Enable HTTP authentication support]) +AC_HELP_STRING([--disable-http-auth],[Disable HTTP authentication support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_HTTP_AUTH, 1, [disable HTTP authentication]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable DoH support +dnl +AC_MSG_CHECKING([whether to support DoH]) +AC_ARG_ENABLE(doh, +AC_HELP_STRING([--enable-doh],[Enable DoH support]) +AC_HELP_STRING([--disable-doh],[Disable DoH support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_DOH, 1, [disable DoH]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable mime API support +dnl +AC_MSG_CHECKING([whether to support the MIME API]) +AC_ARG_ENABLE(mime, +AC_HELP_STRING([--enable-mime],[Enable mime API support]) +AC_HELP_STRING([--disable-mime],[Disable mime API support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_MIME, 1, [disable mime API]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable date parsing +dnl +AC_MSG_CHECKING([whether to support date parsing]) +AC_ARG_ENABLE(dateparse, +AC_HELP_STRING([--enable-dateparse],[Enable date parsing]) +AC_HELP_STRING([--disable-dateparse],[Disable date parsing]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_PARSEDATE, 1, [disable date parsing]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable netrc +dnl +AC_MSG_CHECKING([whether to support netrc parsing]) +AC_ARG_ENABLE(netrc, +AC_HELP_STRING([--enable-netrc],[Enable netrc parsing]) +AC_HELP_STRING([--disable-netrc],[Disable netrc parsing]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_NETRC, 1, [disable netrc parsing]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable progress-meter +dnl +AC_MSG_CHECKING([whether to support progress-meter]) +AC_ARG_ENABLE(progress-meter, +AC_HELP_STRING([--enable-progress-meter],[Enable progress-meter]) +AC_HELP_STRING([--disable-progress-meter],[Disable progress-meter]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_PROGRESS_METER, 1, [disable progress-meter]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl disable shuffle DNS support +dnl +AC_MSG_CHECKING([whether to support DNS shuffling]) +AC_ARG_ENABLE(dnsshuffle, +AC_HELP_STRING([--enable-dnsshuffle],[Enable DNS shuffling]) +AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shuffling]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + AC_DEFINE(CURL_DISABLE_SHUFFLE_DNS, 1, [disable DNS shuffling]) + ;; + *) AC_MSG_RESULT(yes) + ;; + esac ], + AC_MSG_RESULT(yes) +) + +dnl ************************************************************ +dnl switch on/off alt-svc +dnl +curl_altsvc_msg="no (--enable-alt-svc)"; +AC_MSG_CHECKING([whether to support alt-svc]) +AC_ARG_ENABLE(alt-svc, +AC_HELP_STRING([--enable-alt-svc],[Enable alt-svc support]) +AC_HELP_STRING([--disable-alt-svc],[Disable alt-svc support]), +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(yes) + curl_altsvc_msg="enabled"; + enable_altsvc="yes" + ;; + esac ], + AC_MSG_RESULT(no) +) + +if test "$enable_altsvc" = "yes"; then + AC_DEFINE(USE_ALTSVC, 1, [to enable alt-svc]) + experimental="$experimental alt-svc" +fi + +dnl ************************************************************* +dnl check whether ESNI support, if desired, is actually available +dnl +if test "x$want_esni" != "xno"; then + AC_MSG_CHECKING([whether ESNI support is available]) + + dnl assume NOT and look for sufficient condition + ESNI_ENABLED=0 + ESNI_SUPPORT='' + + dnl OpenSSL with a chosen ESNI function should be enough + dnl so more exhaustive checking seems unnecessary for now + if test "x$OPENSSL_ENABLED" = "x1"; then + AC_CHECK_FUNCS(SSL_get_esni_status, + ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)" + ESNI_ENABLED=1) + + dnl add 'elif' chain here for additional implementations + fi + + dnl now deal with whatever we found + if test "x$ESNI_ENABLED" = "x1"; then + AC_DEFINE(USE_ESNI, 1, [if ESNI support is available]) + AC_MSG_RESULT($ESNI_SUPPORT) + experimental="$experimental ESNI" + else + AC_MSG_ERROR([--enable-esni ignored: No ESNI support found]) + fi +fi + +dnl ************************************************************ +dnl hiding of library internal symbols +dnl +CURL_CONFIGURE_SYMBOL_HIDING + +dnl +dnl All the library dependencies put into $LIB apply to libcurl only. +dnl +LIBCURL_LIBS=$LIBS + +AC_SUBST(LIBCURL_LIBS) +AC_SUBST(CURL_NETWORK_LIBS) +AC_SUBST(CURL_NETWORK_AND_TIME_LIBS) + +dnl BLANK_AT_MAKETIME may be used in our Makefile.am files to blank +dnl LIBS variable used in generated makefile at makefile processing +dnl time. Doing this functionally prevents LIBS from being used for +dnl all link targets in given makefile. +BLANK_AT_MAKETIME= +AC_SUBST(BLANK_AT_MAKETIME) + +AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes) + +dnl yes or no +ENABLE_SHARED="$enable_shared" +AC_SUBST(ENABLE_SHARED) + +dnl to let curl-config output the static libraries correctly +ENABLE_STATIC="$enable_static" +AC_SUBST(ENABLE_STATIC) + + +dnl +dnl For keeping supported features and protocols also in pkg-config file +dnl since it is more cross-compile friendly than curl-config +dnl + +if test "x$OPENSSL_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" +elif test -n "$SSL_ENABLED"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES SSL" +fi +if test "x$IPV6_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES IPv6" +fi +if test "x$USE_UNIX_SOCKETS" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES UnixSockets" +fi +if test "x$HAVE_LIBZ" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES libz" +fi +if test "x$HAVE_BROTLI" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES brotli" +fi +if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \ + -o "x$USE_THREADS_WIN32" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS" +fi +if test "x$IDN_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES IDN" +fi +if test "x$USE_WINDOWS_SSPI" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES SSPI" +fi + +if test "x$HAVE_GSSAPI" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API" +fi + +if test "x$curl_psl_msg" = "xenabled"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES PSL" +fi + +if test "x$enable_altsvc" = "xyes"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES alt-svc" +fi + +if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \ + \( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then + SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO" +fi + +if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \ + \( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then + SUPPORT_FEATURES="$SUPPORT_FEATURES Kerberos" +fi + +if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then + if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ + -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \ + -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM" + + if test "x$CURL_DISABLE_HTTP" != "x1" -a \ + "x$NTLM_WB_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM_WB" + fi + fi +fi + +if test "x$USE_TLS_SRP" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP" +fi + +if test "x$USE_NGHTTP2" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2" +fi + +if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3" +fi + +if test "x$CURL_WITH_MULTI_SSL" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL" +fi + +if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \ + -o "x$NSS_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy" +fi + +if test "x$ESNI_ENABLED" = "x1"; then + SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI" +fi + +AC_SUBST(SUPPORT_FEATURES) + +dnl For supported protocols in pkg-config file +if test "x$CURL_DISABLE_HTTP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS HTTP" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS HTTPS" + fi +fi +if test "x$CURL_DISABLE_FTP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS FTP" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS FTPS" + fi +fi +if test "x$CURL_DISABLE_FILE" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS FILE" +fi +if test "x$CURL_DISABLE_TELNET" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS TELNET" +fi +if test "x$CURL_DISABLE_LDAP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS LDAP" + if test "x$CURL_DISABLE_LDAPS" != "x1"; then + if (test "x$USE_OPENLDAP" = "x1" && test "x$SSL_ENABLED" = "x1") || + (test "x$USE_OPENLDAP" != "x1" && test "x$HAVE_LDAP_SSL" = "x1"); then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS LDAPS" + fi + fi +fi +if test "x$CURL_DISABLE_DICT" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS DICT" +fi +if test "x$CURL_DISABLE_TFTP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS TFTP" +fi +if test "x$CURL_DISABLE_GOPHER" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER" +fi +if test "x$CURL_DISABLE_POP3" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3S" + fi +fi +if test "x$CURL_DISABLE_IMAP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS IMAP" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS IMAPS" + fi +fi +if test "x$CURL_DISABLE_SMB" != "x1" \ + -a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \ + -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \ + -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \ + -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \); then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMBS" + fi +fi +if test "x$CURL_DISABLE_SMTP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMTP" + if test "x$SSL_ENABLED" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMTPS" + fi +fi +if test "x$USE_LIBSSH2" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP" + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP" +fi +if test "x$USE_LIBSSH" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP" + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP" +fi +if test "x$USE_WOLFSSH" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP" + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP" +fi +if test "x$CURL_DISABLE_RTSP" != "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTSP" +fi +if test "x$USE_LIBRTMP" = "x1"; then + SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTMP" +fi + +dnl replace spaces with newlines +dnl sort the lines +dnl replace the newlines back to spaces +SUPPORT_PROTOCOLS=`echo $SUPPORT_PROTOCOLS | tr ' ' '\012' | sort | tr '\012' ' '` + +AC_SUBST(SUPPORT_PROTOCOLS) + +dnl squeeze whitespace out of some variables + +squeeze CFLAGS +squeeze CPPFLAGS +squeeze DEFS +squeeze LDFLAGS +squeeze LIBS + +squeeze LIBCURL_LIBS +squeeze CURL_NETWORK_LIBS +squeeze CURL_NETWORK_AND_TIME_LIBS + +squeeze SUPPORT_FEATURES +squeeze SUPPORT_PROTOCOLS + +XC_CHECK_BUILD_FLAGS + +SSL_BACKENDS=${ssl_backends} +AC_SUBST(SSL_BACKENDS) + +if test "x$want_curldebug_assumed" = "xyes" && + test "x$want_curldebug" = "xyes" && test "x$USE_ARES" = "x1"; then + ac_configure_args="$ac_configure_args --enable-curldebug" +fi + +AC_CONFIG_FILES([Makefile \ + docs/Makefile \ + docs/examples/Makefile \ + docs/libcurl/Makefile \ + docs/libcurl/opts/Makefile \ + docs/cmdline-opts/Makefile \ + include/Makefile \ + include/curl/Makefile \ + src/Makefile \ + lib/Makefile \ + scripts/Makefile \ + lib/libcurl.vers \ + tests/Makefile \ + tests/certs/Makefile \ + tests/certs/scripts/Makefile \ + tests/data/Makefile \ + tests/server/Makefile \ + tests/libtest/Makefile \ + tests/unit/Makefile \ + packages/Makefile \ + packages/vms/Makefile \ + curl-config \ + libcurl.pc +]) +AC_OUTPUT + +CURL_GENERATE_CONFIGUREHELP_PM + +XC_AMEND_DISTCLEAN([lib src tests/unit tests/server tests/libtest docs/examples]) + +AC_MSG_NOTICE([Configured to build curl/libcurl: + + Host setup: ${host} + Install prefix: ${prefix} + Compiler: ${CC} + CFLAGS: ${CFLAGS} + CPPFLAGS: ${CPPFLAGS} + LDFLAGS: ${LDFLAGS} + LIBS: ${LIBS} + + curl version: ${CURLVERSION} + SSL: ${curl_ssl_msg} + SSH: ${curl_ssh_msg} + zlib: ${curl_zlib_msg} + brotli: ${curl_brotli_msg} + GSS-API: ${curl_gss_msg} + TLS-SRP: ${curl_tls_srp_msg} + resolver: ${curl_res_msg} + IPv6: ${curl_ipv6_msg} + Unix sockets: ${curl_unix_sockets_msg} + IDN: ${curl_idn_msg} + Build libcurl: Shared=${enable_shared}, Static=${enable_static} + Built-in manual: ${curl_manual_msg} + --libcurl option: ${curl_libcurl_msg} + Verbose errors: ${curl_verbose_msg} + Code coverage: ${curl_coverage_msg} + SSPI: ${curl_sspi_msg} + ca cert bundle: ${ca}${ca_warning} + ca cert path: ${capath}${capath_warning} + ca fallback: ${with_ca_fallback} + LDAP: ${curl_ldap_msg} + LDAPS: ${curl_ldaps_msg} + RTSP: ${curl_rtsp_msg} + RTMP: ${curl_rtmp_msg} + Metalink: ${curl_mtlnk_msg} + PSL: ${curl_psl_msg} + Alt-svc: ${curl_altsvc_msg} + HTTP2: ${curl_h2_msg} + HTTP3: ${curl_h3_msg} + ESNI: ${curl_esni_msg} + Protocols: ${SUPPORT_PROTOCOLS} + Features: ${SUPPORT_FEATURES} +]) +if test -n "$experimental"; then + cat >&2 << _EOF + WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution! +_EOF +fi diff --git a/curl-config.in b/curl-config.in new file mode 100644 index 0000000000..0a7e0353fa --- /dev/null +++ b/curl-config.in @@ -0,0 +1,194 @@ +#! /bin/sh +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 2001 - 2018, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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. +# +########################################################################### + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=@includedir@ +cppflag_curl_staticlib=@CPPFLAG_CURL_STATICLIB@ + +usage() +{ + cat <&2 + exit 1 + fi + ;; + + --configure) + echo @CONFIGURE_OPTIONS@ + ;; + + *) + echo "unknown option: $1" + usage 1 + ;; + esac + shift +done + +exit 0 diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000..60f329382c --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,4 @@ +*.html +*.pdf +curl.1 +*.1.dist diff --git a/docs/ALTSVC.md b/docs/ALTSVC.md new file mode 100644 index 0000000000..6a462bbbc8 --- /dev/null +++ b/docs/ALTSVC.md @@ -0,0 +1,39 @@ +# Alt-Svc + +curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header. + +## Enable Alt-Svc in build + +`./configure --enable-alt-svc` + +## Standard + +[RFC 7838](https://tools.ietf.org/html/rfc7838) + +# Alt-Svc cache file format + +This a text based file with one line per entry and each line consists of nine +space separated fields. + +## Example + + h2 quic.tech 8443 h3-22 quic.tech 8443 "20190808 06:18:37" 0 0 + +## Fields + +1. The ALPN id for the source origin +2. The host name for the source origin +3. The port number for the source origin +4. The ALPN id for the destination host +5. The host name for the destination host +6. The host number for the destination host +7. The expiration date and time of this entry within double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT. +8. Boolean (1 or 0) if "persist" was set for this entry +9. Integer priority value (not currently used) + +# TODO + +- handle multiple response headers, when one of them says `clear` (should + override them all) +- using `Age:` value for caching age as per spec +- `CURLALTSVC_IMMEDIATELY` support diff --git a/docs/BINDINGS.md b/docs/BINDINGS.md new file mode 100644 index 0000000000..d0e80b8ac6 --- /dev/null +++ b/docs/BINDINGS.md @@ -0,0 +1,127 @@ +libcurl bindings +================ + + Creative people have written bindings or interfaces for various environments + and programming languages. Using one of these allows you to take advantage of + curl powers from within your favourite language or system. + + This is a list of all known interfaces as of this writing. + + The bindings listed below are not part of the curl/libcurl distribution + archives, but must be downloaded and installed separately. + +[Ada95](https://web.archive.org/web/20070403105909/www.almroth.com/adacurl/index.html) Written by Andreas Almroth + +[Basic](http://scriptbasic.com/) ScriptBasic bindings written by Peter Verhas + +C++: [curlpp](http://curlpp.org/) Written by Jean-Philippe Barrette-LaPierre, +[curlcpp](https://github.com/JosephP91/curlcpp) by Giuseppe Persico and [C++ +Requests](https://github.com/whoshuu/cpr) by Huu Nguyen + +[Ch](https://chcurl.sourceforge.io/) Written by Stephen Nestinger and Jonathan Rogado + +Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho +[curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood + +Clojure: [clj-curl](https://github.com/lsevero/clj-curl) by Lucas Severo + +[D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert + +[Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev + +[Dylan](https://dylanlibs.sourceforge.io/) Written by Chris Double + +[Eiffel](https://room.eiffel.com/library/curl) Written by Eiffel Software + +[Euphoria](https://web.archive.org/web/20050204080544/rays-web.com/eulibcurl.htm) Written by Ray Smith + +[Falcon](http://www.falconpl.org/index.ftd?page_id=prjs&prj_id=curl) + +[Ferite](https://web.archive.org/web/20150102192018/ferite.org/) Written by Paul Querna + +[Gambas](https://gambas.sourceforge.io/) + +[glib/GTK+](https://web.archive.org/web/20100526203452/atterer.net/glibcurl) Written by Richard Atterer + +Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang + +[Guile](http://www.lonelycactus.com/guile-curl.html) Written by Michael L. Gran + +[Harbour](https://github.com/vszakats/harbour-core/tree/master/contrib/hbcurl) Written by Viktor Szakáts + +[Haskell](https://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl) Written by Galois, Inc + +[Java](https://github.com/pjlegato/curl-java) + +[Julia](https://github.com/forio/Curl.jl) Written by Paul Howe + +[Kapito](https://github.com/puzza007/katipo) is an Erlang HTTP library around libcurl. + +[Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy + +Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel + +[Mono](https://forge.novell.com/modules/xfmod/project/?libcurl-mono) Written by Jeffrey Phillips + +[.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips + +[Nim](https://nimble.directory/pkg/libcurl) wrapper for libcurl + +[node.js](https://github.com/JCMais/node-libcurl) node-libcurl by Jonathan Cardoso Machado + +[Object-Pascal](https://web.archive.org/web/20020610214926/www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern. + +[OCaml](https://opam.ocaml.org/packages/ocurl/) Written by Lars Nilsson and ygrek + +[Pascal](https://web.archive.org/web/20030804091414/houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer. + +Perl: [WWW::Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris +Bailiff and Bálint Szilakszi, +[perl6-net-curl](https://github.com/azawawi/perl6-net-curl) by Ahmad M. Zawawi +[NET::Curl](https://metacpan.org/pod/Net::Curl) by Przemyslaw Iskra + +[PHP](https://php.net/curl) Originally written by Sterling Hughes + +[PostgreSQL](https://github.com/pramsey/pgsql-http) - HTTP client for PostgreSQL + +[PureBasic](https://www.purebasic.com/documentation/http/index.html) uses libcurl in its "native" HTTP subsystem + +[Python](http://pycurl.io/) PycURL by Kjetil Jacobsen + +[R](https://cran.r-project.org/package=curl) + +[Rexx](https://rexxcurl.sourceforge.io/) Written Mark Hessling + +[Ring](https://ring-lang.sourceforge.io/doc1.3/libcurl.html) RingLibCurl by Mahmoud Fayed + +RPG, support for ILE/RPG on OS/400 is included in source distribution + +Ruby: [curb](https://github.com/taf2/curb) written by Ross Bamford + +[Rust](https://github.com/carllerche/curl-rust) curl-rust - by Carl Lerche + +[Scheme](https://www.metapaper.net/lisovsky/web/curl/) Bigloo binding by Kirill Lisovsky + +[Scilab](https://help.scilab.org/docs/current/fr_FR/getURL.html) binding by Sylvestre Ledru + +[S-Lang](https://www.jedsoft.org/slang/modules/curl.html) by John E Davis + +[Smalltalk](http://www.squeaksource.com/CurlPlugin/) Written by Danil Osipchuk + +[SP-Forth](https://sourceforge.net/p/spf/spf/ci/master/tree/devel/~ac/lib/lin/curl/) Written by Andrey Cherezov + +[SPL](http://www.clifford.at/spl/) Written by Clifford Wolf + +[Tcl](https://web.archive.org/web/20160826011806/mirror.yellow5.com/tclcurl/) Tclcurl by Andrés García + +[Visual Basic](https://sourceforge.net/projects/libcurl-vb/) libcurl-vb by Jeffrey Phillips + +[Visual Foxpro](https://web.archive.org/web/20130730181523/www.ctl32.com.ar/libcurl.asp) by Carlos Alloatti + +[Q](https://q-lang.sourceforge.io/) The libcurl module is part of the default install + +[wxWidgets](https://wxcode.sourceforge.io/components/wxcurl/) Written by Casey O'Donnell + +[XBLite](https://web.archive.org/web/20060426150418/perso.wanadoo.fr/xblite/libraries.html) Written by David Szafranski + +[Xojo](https://github.com/charonn0/RB-libcURL) Written by Andrew Lambert diff --git a/docs/BUG-BOUNTY.md b/docs/BUG-BOUNTY.md new file mode 100644 index 0000000000..8ee9ac62f4 --- /dev/null +++ b/docs/BUG-BOUNTY.md @@ -0,0 +1,106 @@ +# The curl bug bounty + +The curl project runs a bug bounty program in association with +[HackerOne](https://www.hackerone.com) and the [Internet Bug +Bounty](https://internetbugbounty.org). + +# How does it work? + +Start out by posting your suspected security vulnerability directly to [curl's +HackerOne program](https://hackerone.com/curl). + +After you have reported a security issue, it has been deemed credible, and a +patch and advisory has been made public, you may be eligible for a bounty from +this program. + +See all details at [https://hackerone.com/curl](https://hackerone.com/curl) + +This bounty is relying on funds from sponsors. If you use curl professionally, +consider help funding this! See +[https://opencollective.com/curl](https://opencollective.com/curl) for +details. + +# What are the reward amounts? + +The curl projects offer monetary compensation for reported and published +security vulnerabilities. The amount of money that is rewarded depends on how +serious the flaw is determined to be. + +We offer reward money *up to* a certain amount per severity. The curl security +team determines the severity of each reported flaw on a case by case basis and +the exact amount rewarded to the reporter is then decided. + +Check out the current award amounts at [https://hackerone.com/curl](https://hackerone.com/curl) + +# Who is eligible for a reward? + +Everyone and anyone who reports a security problem in a released curl version +that hasn't already been reported can ask for a bounty. + +Vulnerabilities in features that are off by default and documented as +experimental are not eligible for a reward. + +The vulnerability has to be fixed and publicly announced (by the curl project) +before a bug bounty will be considered. + +Bounties need to be requested within twelve months from the publication of the +vulnerability. + +The vulnerabilities must not have been made public before February 1st, 2019. +We do not retroactively pay for old, already known, or published security +problems. + +# Product vulnerabilities only + +This bug bounty only concerns the curl and libcurl products and thus their +respective source codes - when running on existing hardware. It does not +include documentation, websites, or other infrastructure. + +The curl security team will be the sole arbiter if a reported flaw can be +subject to a bounty or not. + +# How are vulnerabilities graded? + +The grading of each reported vulnerability that makes a reward claim will be +performed by the curl security team. The grading will be based on the CVSS +(Common Vulnerability Scoring System) 3.0. + +# How are reward amounts determined? + +The curl security team first gives the vulnerability a score, as mentioned +above, and based on that level we set an amount depending on the specifics of +the individual case. Other sponsors of the program might also get involved and +can raise the amounts depending on the particular issue. + +# What happens if the bounty fund is drained? + +The bounty fund depends on sponsors. If we pay out more bounties than we add, +the fund will eventually drain. If that end up happening, we will simply not +be able to pay out as high bounties as we would like and hope that we can +convince new sponsors to help us top up the fund again. + +# Regarding taxes, etc. on the bounties + +In the event that the individual receiving a curl bug bounty needs to pay +taxes on the reward money, the responsibility lies with the receiver. The +curl project or its security team never actually receive any of this money, +hold the money, or pay out the money. + +## Bonus levels + +In cooperation with [Dropbox](https://www.dropbox.com) the curl bug bounty can +offer the highest levels of rewards if the issue covers one of the interest +areas of theirs - and only if the bug is graded *high* or *critical*. A +non-exhaustive list of vulnerabilities Dropbox is interested in are: + + - RCE + - URL parsing vulnerabilities with demonstrable security impact + +Dropbox would generally hand out rewards for critical vulnerabilities ranging +from 12k-32k USD where RCE is on the upper end of the spectrum. + +URL parsing vulnerabilities with demonstrable security impact might include +incorrectly determining the authority of a URL when a special character is +inserted into the path of the URL (as a hypothetical). This type of +vulnerability would likely yield 6k-12k unless further impact could be +demonstrated. diff --git a/docs/BUGS b/docs/BUGS new file mode 100644 index 0000000000..480e0caecd --- /dev/null +++ b/docs/BUGS @@ -0,0 +1,302 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +BUGS + + 1. Bugs + 1.1 There are still bugs + 1.2 Where to report + 1.3 Security bugs + 1.4 What to report + 1.5 libcurl problems + 1.6 Who will fix the problems + 1.7 How to get a stack trace + 1.8 Bugs in libcurl bindings + 1.9 Bugs in old versions + + 2. Bug fixing procedure + 2.1 What happens on first filing + 2.2 First response + 2.3 Not reproducible + 2.4 Unresponsive + 2.5 Lack of time/interest + 2.6 KNOWN_BUGS + 2.7 TODO + 2.8 Closing off stalled bugs + +============================================================================== + +1.1 There are still bugs + + Curl and libcurl keep being developed. Adding features and changing code + means that bugs will sneak in, no matter how hard we try not to. + + Of course there are lots of bugs left. And lots of misfeatures. + + To help us make curl the stable and solid product we want it to be, we need + bug reports and bug fixes. + +1.2 Where to report + + If you can't fix a bug yourself and submit a fix for it, try to report an as + detailed report as possible to a curl mailing list to allow one of us to + have a go at a solution. You can optionally also post your bug/problem at + curl's bug tracking system over at + + https://github.com/curl/curl/issues + + Please read the rest of this document below first before doing that! + + If you feel you need to ask around first, find a suitable mailing list and + post there. The lists are available on https://curl.haxx.se/mail/ + +1.3 Security bugs + + If you find a bug or problem in curl or libcurl that you think has a + security impact, for example a bug that can put users in danger or make them + vulnerable if the bug becomes public knowledge, then please report that bug + using our security development process. + + Security related bugs or bugs that are suspected to have a security impact, + should be reported on the curl security tracker at HackerOne: + + https://hackerone.com/curl + + This ensures that the report reaches the curl security team so that they + first can be deal with the report away from the public to minimize the harm + and impact it will have on existing users out there who might be using the + vulnerable versions. + + The curl project's process for handling security related issues is + documented here: + + https://curl.haxx.se/dev/secprocess.html + +1.4 What to report + + When reporting a bug, you should include all information that will help us + understand what's wrong, what you expected to happen and how to repeat the + bad behavior. You therefore need to tell us: + + - your operating system's name and version number + + - what version of curl you're using (curl -V is fine) + + - versions of the used libraries that libcurl is built to use + + - what URL you were working with (if possible), at least which protocol + + and anything and everything else you think matters. Tell us what you + expected to happen, tell use what did happen, tell us how you could make it + work another way. Dig around, try out, test. Then include all the tiny bits + and pieces in your report. You will benefit from this yourself, as it will + enable us to help you quicker and more accurately. + + Since curl deals with networks, it often helps us if you include a protocol + debug dump with your bug report. The output you get by using the -v or + --trace options. + + If curl crashed, causing a core dump (in unix), there is hardly any use to + send that huge file to anyone of us. Unless we have an exact same system + setup as you, we can't do much with it. Instead we ask you to get a stack + trace and send that (much smaller) output to us instead! + + The address and how to subscribe to the mailing lists are detailed in the + MANUAL file. + +1.5 libcurl problems + + When you've written your own application with libcurl to perform transfers, + it is even more important to be specific and detailed when reporting bugs. + + Tell us the libcurl version and your operating system. Tell us the name and + version of all relevant sub-components like for example the SSL library + you're using and what name resolving your libcurl uses. If you use SFTP or + SCP, the libssh2 version is relevant etc. + + Showing us a real source code example repeating your problem is the best way + to get our attention and it will greatly increase our chances to understand + your problem and to work on a fix (if we agree it truly is a problem). + + Lots of problems that appear to be libcurl problems are actually just abuses + of the libcurl API or other malfunctions in your applications. It is advised + that you run your problematic program using a memory debug tool like + valgrind or similar before you post memory-related or "crashing" problems to + us. + +1.6 Who will fix the problems + + If the problems or bugs you describe are considered to be bugs, we want to + have the problems fixed. + + There are no developers in the curl project that are paid to work on bugs. + All developers that take on reported bugs do this on a voluntary basis. We + do it out of an ambition to keep curl and libcurl excellent products and out + of pride. + + But please do not assume that you can just lump over something to us and it + will then magically be fixed after some given time. Most often we need + feedback and help to understand what you've experienced and how to repeat a + problem. Then we may only be able to assist YOU to debug the problem and to + track down the proper fix. + + We get reports from many people every month and each report can take a + considerable amount of time to really go to the bottom with. + +1.7 How to get a stack trace + + First, you must make sure that you compile all sources with -g and that you + don't 'strip' the final executable. Try to avoid optimizing the code as + well, remove -O, -O2 etc from the compiler options. + + Run the program until it cores. + + Run your debugger on the core file, like ' curl core'. + should be replaced with the name of your debugger, in most cases that will + be 'gdb', but 'dbx' and others also occur. + + When the debugger has finished loading the core file and presents you a + prompt, enter 'where' (without the quotes) and press return. + + The list that is presented is the stack trace. If everything worked, it is + supposed to contain the chain of functions that were called when curl + crashed. Include the stack trace with your detailed bug report. It'll help a + lot. + +1.8 Bugs in libcurl bindings + + There will of course pop up bugs in libcurl bindings. You should then + primarily approach the team that works on that particular binding and see + what you can do to help them fix the problem. + + If you suspect that the problem exists in the underlying libcurl, then + please convert your program over to plain C and follow the steps outlined + above. + +1.9 Bugs in old versions + + The curl project typically releases new versions every other month, and we + fix several hundred bugs per year. For a huge table of releases, number of + bug fixes and more, see: https://curl.haxx.se/docs/releases.html + + The developers in the curl project do not have bandwidth or energy enough to + maintain several branches or to spend much time on hunting down problems in + old versions when chances are we already fixed them or at least that they've + changed nature and appearance in later versions. + + When you experience a problem and want to report it, you really SHOULD + include the version number of the curl you're using when you experience the + issue. If that version number shows us that you're using an out-of-date + curl, you should also try out a modern curl version to see if the problem + persists or how/if it has changed in appearance. + + Even if you cannot immediately upgrade your application/system to run the + latest curl version, you can most often at least run a test version or + experimental build or similar, to get this confirmed or not. + + At times people insist that they cannot upgrade to a modern curl version, + but instead they "just want the bug fixed". That's fine, just don't count on + us spending many cycles on trying to identify which single commit, if that's + even possible, that at some point in the past fixed the problem you're now + experiencing. + + Security wise, it is almost always a bad idea to lag behind the current curl + versions by a lot. We keeping discovering and reporting security problems + over time see you can see in this table: + https://curl.haxx.se/docs/vulnerabilities.html + +2. Bug fixing procedure + +2.1 What happens on first filing + + When a new issue is posted in the issue tracker or on the mailing list, the + team of developers first need to see the report. Maybe they took the day + off, maybe they're off in the woods hunting. Have patience. Allow at least a + few days before expecting someone to have responded. + + In the issue tracker you can expect that some labels will be set on the + issue to help categorize it. + +2.2 First response + + If your issue/bug report wasn't perfect at once (and few are), chances are + that someone will ask follow-up questions. Which version did you use? Which + options did you use? How often does the problem occur? How can we reproduce + this problem? Which protocols does it involve? Or perhaps much more specific + and deep diving questions. It all depends on your specific issue. + + You should then respond to these follow-up questions and provide more info + about the problem, so that we can help you figure it out. Or maybe you can + help us figure it out. An active back-and-forth communication is important + and the key for finding a cure and landing a fix. + +2.3 Not reproducible + + For problems that we can't reproduce and can't understand even after having + gotten all the info we need and having studied the source code over again, + are really hard to solve so then we may require further work from you who + actually see or experience the problem. + +2.4 Unresponsive + + If the problem haven't been understood or reproduced, and there's nobody + responding to follow-up questions or questions asking for clarifications or + for discussing possible ways to move forward with the task, we take that as + a strong suggestion that the bug is not important. + + Unimportant issues will be closed as inactive sooner or later as they can't + be fixed. The inactivity period (waiting for responses) should not be + shorter than two weeks but may extend months. + +2.5 Lack of time/interest + + Bugs that are filed and are understood can unfortunately end up in the + "nobody cares enough about it to work on it" category. Such bugs are + perfectly valid problems that *should* get fixed but apparently aren't. We + try to mark such bugs as "KNOWN_BUGS material" after a time of inactivity + and if no activity is noticed after yet some time those bugs are added to + KNOWN_BUGS and are closed in the issue tracker. + +2.6 KNOWN_BUGS + + This is a list of known bugs. Bugs we know exist and that have been pointed + out but that haven't yet been fixed. The reasons for why they haven't been + fixed can involve anything really, but the primary reason is that nobody has + considered these problems to be important enough to spend the necessary time + and effort to have them fixed. + + The KNOWN_BUGS are always up for grabs and we will always love the ones who + bring one of them back to live and offers solutions to them. + + The KNOWN_BUGS document has a sibling document known as TODO. + +2.7 TODO + + Issues that are filed or reported that aren't really bugs but more missing + features or ideas for future improvements and so on are marked as + 'enhancement' or 'feature-request' and will be added to the TODO document + instead and the issue is closed. We don't keep TODO items in the issue + tracker. + + The TODO document is full of ideas and suggestions of what we can add or fix + one day. You're always encouraged and free to grab one of those items and + take up a discussion with the curl development team on how that could be + implemented or provided in the project so that you can work on ticking it + odd that document. + + If the issue is rather a bug and not a missing feature or functionality, it + is listed in KNOWN_BUGS instead. + +2.8 Closing off stalled bugs + + The issue and pull request trackers on https://github.com/curl/curl will + only hold "active" entries (using a non-precise definition of what active + actually is, but they're at least not completely dead). Those that are + abandoned or in other ways dormant will be closed and sometimes added to + TODO and KNOWN_BUGS instead. + + This way, we only have "active" issues open on github. Irrelevant issues and + pull requests will not distract developers or casual visitors. diff --git a/docs/CHECKSRC.md b/docs/CHECKSRC.md new file mode 100644 index 0000000000..10e2f4d737 --- /dev/null +++ b/docs/CHECKSRC.md @@ -0,0 +1,162 @@ +# checksrc + +This is the tool we use within the curl project to scan C source code and +check that it adheres to our [Source Code Style guide](CODE_STYLE.md). + +## Usage + + checksrc.pl [options] [file1] [file2] ... + +## Command line options + +`-W[file]` whitelists that file and excludes it from being checked. Helpful +when, for example, one of the files is generated. + +`-D[dir]` directory name to prepend to file names when accessing them. + +`-h` shows the help output, that also lists all recognized warnings + +## What does checksrc warn for? + +checksrc does not check and verify the code against the entire style guide, +but the script is instead an effort to detect the most common mistakes and +syntax mistakes that contributors make before they get accustomed to our code +style. Heck, many of us regulars do the mistakes too and this script helps us +keep the code in shape. + + checksrc.pl -h + +Lists how to use the script and it lists all existing warnings it has and +problems it detects. At the time of this writing, the existing checksrc +warnings are: + +- `ASSIGNWITHINCONDITION`: Assignment within a conditional expression. The + code style mandates the assignment to be done outside of it. + +- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the more + appropriate `char *name` style. The asterisk should sit next to the name. + +- `ASTERISKSPACE`: A pointer was declared like `char * name` instead of the + more appropriate `char *name` style. The asterisk should sit right next to + the name without a space in between. + +- `BADCOMMAND`: There's a bad !checksrc! instruction in the code. See the + **Ignore certain warnings** section below for details. + +- `BANNEDFUNC`: A banned function was used. The functions sprintf, vsprintf, + strcat, strncat, gets are **never** allowed in curl source code. + +- `BRACEELSE`: '} else' on the same line. The else is supposed to be on the + following line. + +- `BRACEPOS`: wrong position for an open brace (`{`). + +- `COMMANOSPACE`: a comma without following space + +- `COPYRIGHT`: the file is missing a copyright statement! + +- `CPPCOMMENTS`: `//` comment detected, that's not C89 compliant + +- `FOPENMODE`: `fopen()` needs a macro for the mode string, use it + +- `INDENTATION`: detected a wrong start column for code. Note that this + warning only checks some specific places and will certainly miss many bad + indentations. + +- `LONGLINE`: A line is longer than 79 columns. + +- `MULTISPACE`: Multiple spaces were found where only one should be used. + +- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer + `a = 2` and *not* `a=2`. + +- `OPENCOMMENT`: File ended with a comment (`/*`) still "open". + +- `PARENBRACE`: `){` was used without sufficient space in between. + +- `RETURNNOSPACE`: `return` was used without space between the keyword and the + following value. + +- `SEMINOSPACE`: There was no space (or newline) following a semicolon. + +- `SIZEOFNOPAREN`: Found use of sizeof without parentheses. We prefer + `sizeof(int)` style. + +- `SNPRINTF` - Found use of `snprintf()`. Since we use an internal replacement + with a different return code etc, we prefer `msnprintf()`. + +- `SPACEAFTERPAREN`: there was a space after open parenthesis, `( text`. + +- `SPACEBEFORECLOSE`: there was a space before a close parenthesis, `text )`. + +- `SPACEBEFORECOMMA`: there was a space before a comma, `one , two`. + +- `SPACEBEFOREPAREN`: there was a space before an open parenthesis, `if (`, + where one was not expected + +- `SPACESEMICOLON`: there was a space before semicolon, ` ;`. + +- `TABS`: TAB characters are not allowed! + +- `TRAILINGSPACE`: Trailing white space on the line + +- `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used, + that's an ignore that should be removed or changed to get used. + +### Extended warnings + +Some warnings are quite computationally expensive to perform, so they are +turned off by default. To enable these warnings, place a `.checksrc` file in +the directory where they should be activated with commands to enable the +warnings you are interested in. The format of the file is to enable one +warning per line like so: `enable ` + +Currently there is one extended warning which can be enabled: + +- `COPYRIGHTYEAR`: the current changeset hasn't updated the copyright year in + the source file + +## Ignore certain warnings + +Due to the nature of the source code and the flaws of the checksrc tool, there +is sometimes a need to ignore specific warnings. checksrc allows a few +different ways to do this. + +### Inline ignore + +You can control what to ignore within a specific source file by providing +instructions to checksrc in the source code itself. You need a magic marker +that is `!checksrc!` followed by the instruction. The instruction can ask to +ignore a specific warning N number of times or you ignore all of them until +you mark the end of the ignored section. + +Inline ignores are only done for that single specific source code file. + +Example + + /* !checksrc! disable LONGLINE all */ + +This will ignore the warning for overly long lines until it is re-enabled with: + + /* !checksrc! enable LONGLINE */ + +If the enabling isn't performed before the end of the file, it will be enabled +automatically for the next file. + +You can also opt to ignore just N violations so that if you have a single long +line you just can't shorten and is agreed to be fine anyway: + + /* !checksrc! disable LONGLINE 1 */ + +... and the warning for long lines will be enabled again automatically after +it has ignored that single warning. The number `1` can of course be changed to +any other integer number. It can be used to make sure only the exact intended +instances are ignored and nothing extra. + +### Directory wide ignore patterns + +This is a method we've transitioned away from. Use inline ignores as far as +possible. + +Make a `checksrc.whitelist` file in the directory of the source code with the +false positive, and include the full offending line into this file. diff --git a/docs/CIPHERS.md b/docs/CIPHERS.md new file mode 100644 index 0000000000..19aedf36fc --- /dev/null +++ b/docs/CIPHERS.md @@ -0,0 +1,516 @@ +# Ciphers + +With curl's options +[`CURLOPT_SSL_CIPHER_LIST`](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) +and +[`--ciphers`](https://curl.haxx.se/docs/manpage.html#--ciphers) +users can control which ciphers to consider when negotiating TLS connections. + +TLS 1.3 ciphers are supported since curl 7.61 for OpenSSL 1.1.1+ with options +[`CURLOPT_TLS13_CIPHERS`](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) +and +[`--tls13-ciphers`](https://curl.haxx.se/docs/manpage.html#--tls13-ciphers) +. If you are using a different SSL backend you can try setting TLS 1.3 cipher +suites by using the respective regular cipher option. + +The names of the known ciphers differ depending on which TLS backend that +libcurl was built to use. This is an attempt to list known cipher names. + +## OpenSSL + +(based on [OpenSSL docs](https://www.openssl.org/docs/man1.1.0/apps/ciphers.html)) + +When specifying multiple cipher names, separate them with colon (`:`). + +### SSL3 cipher suites + +`NULL-MD5` +`NULL-SHA` +`RC4-MD5` +`RC4-SHA` +`IDEA-CBC-SHA` +`DES-CBC3-SHA` +`DH-DSS-DES-CBC3-SHA` +`DH-RSA-DES-CBC3-SHA` +`DHE-DSS-DES-CBC3-SHA` +`DHE-RSA-DES-CBC3-SHA` +`ADH-RC4-MD5` +`ADH-DES-CBC3-SHA` + +### TLS v1.0 cipher suites + +`NULL-MD5` +`NULL-SHA` +`RC4-MD5` +`RC4-SHA` +`IDEA-CBC-SHA` +`DES-CBC3-SHA` +`DHE-DSS-DES-CBC3-SHA` +`DHE-RSA-DES-CBC3-SHA` +`ADH-RC4-MD5` +`ADH-DES-CBC3-SHA` + +### AES ciphersuites from RFC3268, extending TLS v1.0 + +`AES128-SHA` +`AES256-SHA` +`DH-DSS-AES128-SHA` +`DH-DSS-AES256-SHA` +`DH-RSA-AES128-SHA` +`DH-RSA-AES256-SHA` +`DHE-DSS-AES128-SHA` +`DHE-DSS-AES256-SHA` +`DHE-RSA-AES128-SHA` +`DHE-RSA-AES256-SHA` +`ADH-AES128-SHA` +`ADH-AES256-SHA` + +### SEED ciphersuites from RFC4162, extending TLS v1.0 + +`SEED-SHA` +`DH-DSS-SEED-SHA` +`DH-RSA-SEED-SHA` +`DHE-DSS-SEED-SHA` +`DHE-RSA-SEED-SHA` +`ADH-SEED-SHA` + +### GOST ciphersuites, extending TLS v1.0 + +`GOST94-GOST89-GOST89` +`GOST2001-GOST89-GOST89` +`GOST94-NULL-GOST94` +`GOST2001-NULL-GOST94` + +### Elliptic curve cipher suites + +`ECDHE-RSA-NULL-SHA` +`ECDHE-RSA-RC4-SHA` +`ECDHE-RSA-DES-CBC3-SHA` +`ECDHE-RSA-AES128-SHA` +`ECDHE-RSA-AES256-SHA` +`ECDHE-ECDSA-NULL-SHA` +`ECDHE-ECDSA-RC4-SHA` +`ECDHE-ECDSA-DES-CBC3-SHA` +`ECDHE-ECDSA-AES128-SHA` +`ECDHE-ECDSA-AES256-SHA` +`AECDH-NULL-SHA` +`AECDH-RC4-SHA` +`AECDH-DES-CBC3-SHA` +`AECDH-AES128-SHA` +`AECDH-AES256-SHA` + +### TLS v1.2 cipher suites + +`NULL-SHA256` +`AES128-SHA256` +`AES256-SHA256` +`AES128-GCM-SHA256` +`AES256-GCM-SHA384` +`DH-RSA-AES128-SHA256` +`DH-RSA-AES256-SHA256` +`DH-RSA-AES128-GCM-SHA256` +`DH-RSA-AES256-GCM-SHA384` +`DH-DSS-AES128-SHA256` +`DH-DSS-AES256-SHA256` +`DH-DSS-AES128-GCM-SHA256` +`DH-DSS-AES256-GCM-SHA384` +`DHE-RSA-AES128-SHA256` +`DHE-RSA-AES256-SHA256` +`DHE-RSA-AES128-GCM-SHA256` +`DHE-RSA-AES256-GCM-SHA384` +`DHE-DSS-AES128-SHA256` +`DHE-DSS-AES256-SHA256` +`DHE-DSS-AES128-GCM-SHA256` +`DHE-DSS-AES256-GCM-SHA384` +`ECDHE-RSA-AES128-SHA256` +`ECDHE-RSA-AES256-SHA384` +`ECDHE-RSA-AES128-GCM-SHA256` +`ECDHE-RSA-AES256-GCM-SHA384` +`ECDHE-ECDSA-AES128-SHA256` +`ECDHE-ECDSA-AES256-SHA384` +`ECDHE-ECDSA-AES128-GCM-SHA256` +`ECDHE-ECDSA-AES256-GCM-SHA384` +`ADH-AES128-SHA256` +`ADH-AES256-SHA256` +`ADH-AES128-GCM-SHA256` +`ADH-AES256-GCM-SHA384` +`AES128-CCM` +`AES256-CCM` +`DHE-RSA-AES128-CCM` +`DHE-RSA-AES256-CCM` +`AES128-CCM8` +`AES256-CCM8` +`DHE-RSA-AES128-CCM8` +`DHE-RSA-AES256-CCM8` +`ECDHE-ECDSA-AES128-CCM` +`ECDHE-ECDSA-AES256-CCM` +`ECDHE-ECDSA-AES128-CCM8` +`ECDHE-ECDSA-AES256-CCM8` + +### Camellia HMAC-Based ciphersuites from RFC6367, extending TLS v1.2 + +`ECDHE-ECDSA-CAMELLIA128-SHA256` +`ECDHE-ECDSA-CAMELLIA256-SHA384` +`ECDHE-RSA-CAMELLIA128-SHA256` +`ECDHE-RSA-CAMELLIA256-SHA384` + +### TLS 1.3 cipher suites + +(Note these ciphers are set with `CURLOPT_TLS13_CIPHERS` and `--tls13-ciphers`) + +`TLS_AES_256_GCM_SHA384` +`TLS_CHACHA20_POLY1305_SHA256` +`TLS_AES_128_GCM_SHA256` +`TLS_AES_128_CCM_8_SHA256` +`TLS_AES_128_CCM_SHA256` + +## NSS + +### Totally insecure + +`rc4` +`rc4-md5` +`rc4export` +`rc2` +`rc2export` +`des` +`desede3` + +### SSL3/TLS cipher suites + +`rsa_rc4_128_md5` +`rsa_rc4_128_sha` +`rsa_3des_sha` +`rsa_des_sha` +`rsa_rc4_40_md5` +`rsa_rc2_40_md5` +`rsa_null_md5` +`rsa_null_sha` +`fips_3des_sha` +`fips_des_sha` +`fortezza` +`fortezza_rc4_128_sha` +`fortezza_null` + +### TLS 1.0 Exportable 56-bit Cipher Suites + +`rsa_des_56_sha` +`rsa_rc4_56_sha` + +### AES ciphers + +`dhe_dss_aes_128_cbc_sha` +`dhe_dss_aes_256_cbc_sha` +`dhe_rsa_aes_128_cbc_sha` +`dhe_rsa_aes_256_cbc_sha` +`rsa_aes_128_sha` +`rsa_aes_256_sha` + +### ECC ciphers + +`ecdh_ecdsa_null_sha` +`ecdh_ecdsa_rc4_128_sha` +`ecdh_ecdsa_3des_sha` +`ecdh_ecdsa_aes_128_sha` +`ecdh_ecdsa_aes_256_sha` +`ecdhe_ecdsa_null_sha` +`ecdhe_ecdsa_rc4_128_sha` +`ecdhe_ecdsa_3des_sha` +`ecdhe_ecdsa_aes_128_sha` +`ecdhe_ecdsa_aes_256_sha` +`ecdh_rsa_null_sha` +`ecdh_rsa_128_sha` +`ecdh_rsa_3des_sha` +`ecdh_rsa_aes_128_sha` +`ecdh_rsa_aes_256_sha` +`ecdhe_rsa_null` +`ecdhe_rsa_rc4_128_sha` +`ecdhe_rsa_3des_sha` +`ecdhe_rsa_aes_128_sha` +`ecdhe_rsa_aes_256_sha` +`ecdh_anon_null_sha` +`ecdh_anon_rc4_128sha` +`ecdh_anon_3des_sha` +`ecdh_anon_aes_128_sha` +`ecdh_anon_aes_256_sha` + +### HMAC-SHA256 cipher suites + +`rsa_null_sha_256` +`rsa_aes_128_cbc_sha_256` +`rsa_aes_256_cbc_sha_256` +`dhe_rsa_aes_128_cbc_sha_256` +`dhe_rsa_aes_256_cbc_sha_256` +`ecdhe_ecdsa_aes_128_cbc_sha_256` +`ecdhe_rsa_aes_128_cbc_sha_256` + +### AES GCM cipher suites in RFC 5288 and RFC 5289 + +`rsa_aes_128_gcm_sha_256` +`dhe_rsa_aes_128_gcm_sha_256` +`dhe_dss_aes_128_gcm_sha_256` +`ecdhe_ecdsa_aes_128_gcm_sha_256` +`ecdh_ecdsa_aes_128_gcm_sha_256` +`ecdhe_rsa_aes_128_gcm_sha_256` +`ecdh_rsa_aes_128_gcm_sha_256` + +### cipher suites using SHA384 + +`rsa_aes_256_gcm_sha_384` +`dhe_rsa_aes_256_gcm_sha_384` +`dhe_dss_aes_256_gcm_sha_384` +`ecdhe_ecdsa_aes_256_sha_384` +`ecdhe_rsa_aes_256_sha_384` +`ecdhe_ecdsa_aes_256_gcm_sha_384` +`ecdhe_rsa_aes_256_gcm_sha_384` + +### chacha20-poly1305 cipher suites + +`ecdhe_rsa_chacha20_poly1305_sha_256` +`ecdhe_ecdsa_chacha20_poly1305_sha_256` +`dhe_rsa_chacha20_poly1305_sha_256` + +### TLS 1.3 cipher suites + +`aes_128_gcm_sha_256` +`aes_256_gcm_sha_384` +`chacha20_poly1305_sha_256` + +## GSKit + +Ciphers are internally defined as +[numeric codes](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm), +but libcurl maps them to the following case-insensitive names. + +### SSL2 cipher suites (insecure: disabled by default) + +`rc2-md5` +`rc4-md5` +`exp-rc2-md5` +`exp-rc4-md5` +`des-cbc-md5` +`des-cbc3-md5` + +### SSL3 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-rc2-cbc-md5` +`exp-rc4-md5` +`exp-des-cbc-sha` +`des-cbc3-sha` + +### TLS v1.0 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-rc2-cbc-md5` +`exp-rc4-md5` +`exp-des-cbc-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` + +### TLS v1.1 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-des-cbc-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` + +### TLS v1.2 cipher suites + +`null-md5` +`null-sha` +`null-sha256` +`rc4-md5` +`rc4-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` +`aes128-sha256` +`aes256-sha256` +`aes128-gcm-sha256` +`aes256-gcm-sha384` + +## WolfSSL + +`RC4-SHA`, +`RC4-MD5`, +`DES-CBC3-SHA`, +`AES128-SHA`, +`AES256-SHA`, +`NULL-SHA`, +`NULL-SHA256`, +`DHE-RSA-AES128-SHA`, +`DHE-RSA-AES256-SHA`, +`DHE-PSK-AES256-GCM-SHA384`, +`DHE-PSK-AES128-GCM-SHA256`, +`PSK-AES256-GCM-SHA384`, +`PSK-AES128-GCM-SHA256`, +`DHE-PSK-AES256-CBC-SHA384`, +`DHE-PSK-AES128-CBC-SHA256`, +`PSK-AES256-CBC-SHA384`, +`PSK-AES128-CBC-SHA256`, +`PSK-AES128-CBC-SHA`, +`PSK-AES256-CBC-SHA`, +`DHE-PSK-AES128-CCM`, +`DHE-PSK-AES256-CCM`, +`PSK-AES128-CCM`, +`PSK-AES256-CCM`, +`PSK-AES128-CCM-8`, +`PSK-AES256-CCM-8`, +`DHE-PSK-NULL-SHA384`, +`DHE-PSK-NULL-SHA256`, +`PSK-NULL-SHA384`, +`PSK-NULL-SHA256`, +`PSK-NULL-SHA`, +`HC128-MD5`, +`HC128-SHA`, +`HC128-B2B256`, +`AES128-B2B256`, +`AES256-B2B256`, +`RABBIT-SHA`, +`NTRU-RC4-SHA`, +`NTRU-DES-CBC3-SHA`, +`NTRU-AES128-SHA`, +`NTRU-AES256-SHA`, +`AES128-CCM-8`, +`AES256-CCM-8`, +`ECDHE-ECDSA-AES128-CCM`, +`ECDHE-ECDSA-AES128-CCM-8`, +`ECDHE-ECDSA-AES256-CCM-8`, +`ECDHE-RSA-AES128-SHA`, +`ECDHE-RSA-AES256-SHA`, +`ECDHE-ECDSA-AES128-SHA`, +`ECDHE-ECDSA-AES256-SHA`, +`ECDHE-RSA-RC4-SHA`, +`ECDHE-RSA-DES-CBC3-SHA`, +`ECDHE-ECDSA-RC4-SHA`, +`ECDHE-ECDSA-DES-CBC3-SHA`, +`AES128-SHA256`, +`AES256-SHA256`, +`DHE-RSA-AES128-SHA256`, +`DHE-RSA-AES256-SHA256`, +`ECDH-RSA-AES128-SHA`, +`ECDH-RSA-AES256-SHA`, +`ECDH-ECDSA-AES128-SHA`, +`ECDH-ECDSA-AES256-SHA`, +`ECDH-RSA-RC4-SHA`, +`ECDH-RSA-DES-CBC3-SHA`, +`ECDH-ECDSA-RC4-SHA`, +`ECDH-ECDSA-DES-CBC3-SHA`, +`AES128-GCM-SHA256`, +`AES256-GCM-SHA384`, +`DHE-RSA-AES128-GCM-SHA256`, +`DHE-RSA-AES256-GCM-SHA384`, +`ECDHE-RSA-AES128-GCM-SHA256`, +`ECDHE-RSA-AES256-GCM-SHA384`, +`ECDHE-ECDSA-AES128-GCM-SHA256`, +`ECDHE-ECDSA-AES256-GCM-SHA384`, +`ECDH-RSA-AES128-GCM-SHA256`, +`ECDH-RSA-AES256-GCM-SHA384`, +`ECDH-ECDSA-AES128-GCM-SHA256`, +`ECDH-ECDSA-AES256-GCM-SHA384`, +`CAMELLIA128-SHA`, +`DHE-RSA-CAMELLIA128-SHA`, +`CAMELLIA256-SHA`, +`DHE-RSA-CAMELLIA256-SHA`, +`CAMELLIA128-SHA256`, +`DHE-RSA-CAMELLIA128-SHA256`, +`CAMELLIA256-SHA256`, +`DHE-RSA-CAMELLIA256-SHA256`, +`ECDHE-RSA-AES128-SHA256`, +`ECDHE-ECDSA-AES128-SHA256`, +`ECDH-RSA-AES128-SHA256`, +`ECDH-ECDSA-AES128-SHA256`, +`ECDHE-RSA-AES256-SHA384`, +`ECDHE-ECDSA-AES256-SHA384`, +`ECDH-RSA-AES256-SHA384`, +`ECDH-ECDSA-AES256-SHA384`, +`ECDHE-RSA-CHACHA20-POLY1305`, +`ECDHE-ECDSA-CHACHA20-POLY1305`, +`DHE-RSA-CHACHA20-POLY1305`, +`ECDHE-RSA-CHACHA20-POLY1305-OLD`, +`ECDHE-ECDSA-CHACHA20-POLY1305-OLD`, +`DHE-RSA-CHACHA20-POLY1305-OLD`, +`ADH-AES128-SHA`, +`QSH`, +`RENEGOTIATION-INFO`, +`IDEA-CBC-SHA`, +`ECDHE-ECDSA-NULL-SHA`, +`ECDHE-PSK-NULL-SHA256`, +`ECDHE-PSK-AES128-CBC-SHA256`, +`PSK-CHACHA20-POLY1305`, +`ECDHE-PSK-CHACHA20-POLY1305`, +`DHE-PSK-CHACHA20-POLY1305`, +`EDH-RSA-DES-CBC3-SHA`, + +## Schannel + +Schannel allows the enabling and disabling of encryption algorithms, but not +specific ciphersuites. They are +[defined](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id) by +Microsoft. + +There is also the case that the selected algorithm is not supported by the +protocol or does not match the ciphers offered by the server during the SSL +negotiation. In this case curl will return error +`CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH` +and the request will fail. + +`CALG_MD2`, +`CALG_MD4`, +`CALG_MD5`, +`CALG_SHA`, +`CALG_SHA1`, +`CALG_MAC`, +`CALG_RSA_SIGN`, +`CALG_DSS_SIGN`, +`CALG_NO_SIGN`, +`CALG_RSA_KEYX`, +`CALG_DES`, +`CALG_3DES_112`, +`CALG_3DES`, +`CALG_DESX`, +`CALG_RC2`, +`CALG_RC4`, +`CALG_SEAL`, +`CALG_DH_SF`, +`CALG_DH_EPHEM`, +`CALG_AGREEDKEY_ANY`, +`CALG_HUGHES_MD5`, +`CALG_SKIPJACK`, +`CALG_TEK`, +`CALG_CYLINK_MEK`, +`CALG_SSL3_SHAMD5`, +`CALG_SSL3_MASTER`, +`CALG_SCHANNEL_MASTER_HASH`, +`CALG_SCHANNEL_MAC_KEY`, +`CALG_SCHANNEL_ENC_KEY`, +`CALG_PCT1_MASTER`, +`CALG_SSL2_MASTER`, +`CALG_TLS1_MASTER`, +`CALG_RC5`, +`CALG_HMAC`, +`CALG_TLS1PRF`, +`CALG_HASH_REPLACE_OWF`, +`CALG_AES_128`, +`CALG_AES_192`, +`CALG_AES_256`, +`CALG_AES`, +`CALG_SHA_256`, +`CALG_SHA_384`, +`CALG_SHA_512`, +`CALG_ECDH`, +`CALG_ECMQV`, +`CALG_ECDSA`, +`CALG_ECDH_EPHEM`, diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt new file mode 100644 index 0000000000..694861725b --- /dev/null +++ b/docs/CMakeLists.txt @@ -0,0 +1,3 @@ +#add_subdirectory(examples) +add_subdirectory(libcurl) +add_subdirectory(cmdline-opts) diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..1f71c387bd --- /dev/null +++ b/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,32 @@ +Contributor Code of Conduct +=========================== + +As contributors and maintainers of this project, we pledge to respect all +people who contribute through reporting issues, posting feature requests, +updating documentation, submitting pull requests or patches, and other +activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual +language or imagery, derogatory comments or personal attacks, trolling, public +or private harassment, insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. Project maintainers who do not +follow the Code of Conduct may be removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by opening an issue or contacting one or more of the project +maintainers. + +This Code of Conduct is adapted from the [Contributor +Covenant](https://contributor-covenant.org/), version 1.1.0, available at +[https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/) diff --git a/docs/CODE_STYLE.md b/docs/CODE_STYLE.md new file mode 100644 index 0000000000..0ceb5b9ad6 --- /dev/null +++ b/docs/CODE_STYLE.md @@ -0,0 +1,246 @@ +# curl C code style + +Source code that has a common style is easier to read than code that uses +different styles in different places. It helps making the code feel like one +single code base. Easy-to-read is a very important property of code and helps +making it easier to review when new things are added and it helps debugging +code when developers are trying to figure out why things go wrong. A unified +style is more important than individual contributors having their own personal +tastes satisfied. + +Our C code has a few style rules. Most of them are verified and upheld by the +`lib/checksrc.pl` script. Invoked with `make checksrc` or even by default by +the build system when built after `./configure --enable-debug` has been used. + +It is normally not a problem for anyone to follow the guidelines, as you just +need to copy the style already used in the source code and there are no +particularly unusual rules in our set of rules. + +We also work hard on writing code that are warning-free on all the major +platforms and in general on as many platforms as possible. Code that obviously +will cause warnings will not be accepted as-is. + +## Naming + +Try using a non-confusing naming scheme for your new functions and variable +names. It doesn't necessarily have to mean that you should use the same as in +other places of the code, just that the names should be logical, +understandable and be named according to what they're used for. File-local +functions should be made static. We like lower case names. + +See the [INTERNALS](INTERNALS.md) document on how we name non-exported +library-global symbols. + +## Indenting + +We use only spaces for indentation, never TABs. We use two spaces for each new +open brace. + + if(something_is_true) { + while(second_statement == fine) { + moo(); + } + } + +## Comments + +Since we write C89 code, **//** comments are not allowed. They weren't +introduced in the C standard until C99. We use only **/* comments */**. + + /* this is a comment */ + +## Long lines + +Source code in curl may never be wider than 79 columns and there are two +reasons for maintaining this even in the modern era of very large and high +resolution screens: + +1. Narrower columns are easier to read than very wide ones. There's a reason + newspapers have used columns for decades or centuries. + +2. Narrower columns allow developers to easier show multiple pieces of code + next to each other in different windows. I often have two or three source + code windows next to each other on the same screen - as well as multiple + terminal and debugging windows. + +## Braces + +In if/while/do/for expressions, we write the open brace on the same line as +the keyword and we then set the closing brace on the same indentation level as +the initial keyword. Like this: + + if(age < 40) { + /* clearly a youngster */ + } + +You may omit the braces if they would contain only a one-line statement: + + if(!x) + continue; + +For functions the opening brace should be on a separate line: + + int main(int argc, char **argv) + { + return 1; + } + +## 'else' on the following line + +When adding an **else** clause to a conditional expression using braces, we +add it on a new line after the closing brace. Like this: + + if(age < 40) { + /* clearly a youngster */ + } + else { + /* probably grumpy */ + } + +## No space before parentheses + +When writing expressions using if/while/do/for, there shall be no space +between the keyword and the open parenthesis. Like this: + + while(1) { + /* loop forever */ + } + +## Use boolean conditions + +Rather than test a conditional value such as a bool against TRUE or FALSE, a +pointer against NULL or != NULL and an int against zero or not zero in +if/while conditions we prefer: + + result = do_something(); + if(!result) { + /* something went wrong */ + return result; + } + +## No assignments in conditions + +To increase readability and reduce complexity of conditionals, we avoid +assigning variables within if/while conditions. We frown upon this style: + + if((ptr = malloc(100)) == NULL) + return NULL; + +and instead we encourage the above version to be spelled out more clearly: + + ptr = malloc(100); + if(!ptr) + return NULL; + +## New block on a new line + +We never write multiple statements on the same source line, even for very +short if() conditions. + + if(a) + return TRUE; + else if(b) + return FALSE; + +and NEVER: + + if(a) return TRUE; + else if(b) return FALSE; + +## Space around operators + +Please use spaces on both sides of operators in C expressions. Postfix **(), +[], ->, ., ++, --** and Unary **+, - !, ~, &** operators excluded they should +have no space. + +Examples: + + bla = func(); + who = name[0]; + age += 1; + true = !false; + size += -2 + 3 * (a + b); + ptr->member = a++; + struct.field = b--; + ptr = &address; + contents = *pointer; + complement = ~bits; + empty = (!*string) ? TRUE : FALSE; + +## No parentheses for return values + +We use the 'return' statement without extra parentheses around the value: + + int works(void) + { + return TRUE; + } + +## Parentheses for sizeof arguments + +When using the sizeof operator in code, we prefer it to be written with +parentheses around its argument: + + int size = sizeof(int); + +## Column alignment + +Some statements cannot be completed on a single line because the line would be +too long, the statement too hard to read, or due to other style guidelines +above. In such a case the statement will span multiple lines. + +If a continuation line is part of an expression or sub-expression then you +should align on the appropriate column so that it's easy to tell what part of +the statement it is. Operators should not start continuation lines. In other +cases follow the 2-space indent guideline. Here are some examples from +libcurl: + + if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) && + (handle->set.httpversion != CURL_HTTP_VERSION_1_0) && + (handle->set.httpreq == HTTPREQ_GET || + handle->set.httpreq == HTTPREQ_HEAD)) + /* didn't ask for HTTP/1.0 and a GET or HEAD */ + return TRUE; + +If no parenthesis, use the default indent: + + data->set.http_disable_hostname_check_before_authentication = + (0 != va_arg(param, long)) ? TRUE : FALSE; + +Function invoke with an open parenthesis: + + if(option) { + result = parse_login_details(option, strlen(option), + (userp ? &user : NULL), + (passwdp ? &passwd : NULL), + NULL); + } + +Align with the "current open" parenthesis: + + DEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing " + "server response left\n", + (int)clipamount)); + +## Platform dependent code + +Use **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for +particular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE +shall be generated by the configure script for unix-like systems and they are +hard-coded in the `config-[system].h` files for the others. + +We also encourage use of macros/functions that possibly are empty or defined +to constants when libcurl is built without that feature, to make the code +seamless. Like this example where the **magic()** function works differently +depending on a build-time conditional: + + #ifdef HAVE_MAGIC + void magic(int a) + { + return a + 2; + } + #else + #define magic(x) 1 + #endif + + int content = magic(3); diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md new file mode 100644 index 0000000000..978b87d27d --- /dev/null +++ b/docs/CONTRIBUTE.md @@ -0,0 +1,267 @@ +# Contributing to the curl project + +This document is intended to offer guidelines on how to best contribute to the +curl project. This concerns new features as well as corrections to existing +flaws or bugs. + +## Learning curl + +### Join the Community + +Skip over to [https://curl.haxx.se/mail/](https://curl.haxx.se/mail/) and join +the appropriate mailing list(s). Read up on details before you post +questions. Read this file before you start sending patches! We prefer +questions sent to and discussions being held on the mailing list(s), not sent +to individuals. + +Before posting to one of the curl mailing lists, please read up on the +[mailing list etiquette](https://curl.haxx.se/mail/etiquette.html). + +We also hang out on IRC in #curl on irc.freenode.net + +If you're at all interested in the code side of things, consider clicking +'watch' on the [curl repo on github](https://github.com/curl/curl) to be +notified of pull requests and new issues posted there. + +### License and copyright + +When contributing with code, you agree to put your changes and new code under +the same license curl and libcurl is already using unless stated and agreed +otherwise. + +If you add a larger piece of code, you can opt to make that file or set of +files to use a different license as long as they don't enforce any changes to +the rest of the package and they make sense. Such "separate parts" can not be +GPL licensed (as we don't want copyleft to affect users of libcurl) but they +must use "GPL compatible" licenses (as we want to allow users to use libcurl +properly in GPL licensed environments). + +When changing existing source code, you do not alter the copyright of the +original file(s). The copyright will still be owned by the original creator(s) +or those who have been assigned copyright by the original author(s). + +By submitting a patch to the curl project, you are assumed to have the right +to the code and to be allowed by your employer or whatever to hand over that +patch/code to us. We will credit you for your changes as far as possible, to +give credit but also to keep a trace back to who made what changes. Please +always provide us with your full real name when contributing! + +### What To Read + +Source code, the man pages, the [INTERNALS +document](https://curl.haxx.se/dev/internals.html), +[TODO](https://curl.haxx.se/docs/todo.html), +[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) and the [most recent +changes](https://curl.haxx.se/dev/sourceactivity.html) in git. Just lurking on +the [curl-library mailing +list](https://curl.haxx.se/mail/list.cgi?list=curl-library) will give you a +lot of insights on what's going on right now. Asking there is a good idea too. + +## Write a good patch + +### Follow code style + +When writing C code, follow the +[CODE_STYLE](https://curl.haxx.se/dev/code-style.html) already established in +the project. Consistent style makes code easier to read and mistakes less +likely to happen. Run `make checksrc` before you submit anything, to make sure +you follow the basic style. That script doesn't verify everything, but if it +complains you know you have work to do. + +### Non-clobbering All Over + +When you write new functionality or fix bugs, it is important that you don't +fiddle all over the source files and functions. Remember that it is likely +that other people have done changes in the same source files as you have and +possibly even in the same functions. If you bring completely new +functionality, try writing it in a new source file. If you fix bugs, try to +fix one bug at a time and send them as separate patches. + +### Write Separate Changes + +It is annoying when you get a huge patch from someone that is said to fix 511 +odd problems, but discussions and opinions don't agree with 510 of them - or +509 of them were already fixed in a different way. Then the person merging +this change needs to extract the single interesting patch from somewhere +within the huge pile of source, and that creates a lot of extra work. + +Preferably, each fix that corrects a problem should be in its own patch/commit +with its own description/commit message stating exactly what they correct so +that all changes can be selectively applied by the maintainer or other +interested parties. + +Also, separate changes enable bisecting much better for tracking problems +and regression in the future. + +### Patch Against Recent Sources + +Please try to get the latest available sources to make your patches against. +It makes the lives of the developers so much easier. The very best is if you +get the most up-to-date sources from the git repository, but the latest +release archive is quite OK as well! + +### Documentation + +Writing docs is dead boring and one of the big problems with many open source +projects. But someone's gotta do it! It makes things a lot easier if you +submit a small description of your fix or your new features with every +contribution so that it can be swiftly added to the package documentation. + +The documentation is always made in man pages (nroff formatted) or plain +ASCII files. All HTML files on the web site and in the release archives are +generated from the nroff/ASCII versions. + +### Test Cases + +Since the introduction of the test suite, we can quickly verify that the main +features are working as they're supposed to. To maintain this situation and +improve it, all new features and functions that are added need to be tested +in the test suite. Every feature that is added should get at least one valid +test case that verifies that it works as documented. If every submitter also +posts a few test cases, it won't end up as a heavy burden on a single person! + +If you don't have test cases or perhaps you have done something that is very +hard to write tests for, do explain exactly how you have otherwise tested and +verified your changes. + +## Sharing Your Changes + +### How to get your changes into the main sources + +Ideally you file a [pull request on +github](https://github.com/curl/curl/pulls), but you can also send your plain +patch to [the curl-library mailing +list](https://curl.haxx.se/mail/list.cgi?list=curl-library). + +Either way, your change will be reviewed and discussed there and you will be +expected to correct flaws pointed out and update accordingly, or the change +risks stalling and eventually just getting deleted without action. As a +submitter of a change, you are the owner of that change until it has been merged. + +Respond on the list or on github about the change and answer questions and/or +fix nits/flaws. This is very important. We will take lack of replies as a +sign that you're not very anxious to get your patch accepted and we tend to +simply drop such changes. + +### About pull requests + +With github it is easy to send a [pull +request](https://github.com/curl/curl/pulls) to the curl project to have +changes merged. + +We strongly prefer pull requests to mailed patches, as it makes it a proper +git commit that is easy to merge and they are easy to track and not that easy +to loose in the flood of many emails, like they sometimes do on the mailing +lists. + +Every pull request submitted will automatically be tested in several different +ways. Every pull request is verified for each of the following: + + - ... it still builds, warning-free, on Linux and macOS, with both + clang and gcc + - ... it still builds fine on Windows with several MSVC versions + - ... it still builds with cmake on Linux, with gcc and clang + - ... it follows rudimentary code style rules + - ... the test suite still runs 100% fine + - ... the release tarball (the "dist") still works + - ... it builds fine in-tree as well as out-of-tree + - ... code coverage doesn't shrink drastically + +If the pull-request fails one of these tests, it will show up as a red X and +you are expected to fix the problem. If you don't understand when the issue is +or have other problems to fix the complaint, just ask and other project +members will likely be able to help out. + +When you adjust your pull requests after review, consider squashing the +commits so that we can review the full updated version more easily. + +### Making quality patches + +Make the patch against as recent source versions as possible. + +If you've followed the tips in this document and your patch still hasn't been +incorporated or responded to after some weeks, consider resubmitting it to the +list or better yet: change it to a pull request. + +### Write good commit messages + +A short guide to how to write commit messages in the curl project. + + ---- start ---- + [area]: [short line describing the main effect] + -- empty line -- + [full description, no wider than 72 columns that describe as much as + possible as to why this change is made, and possibly what things + it fixes and everything else that is related] + -- empty line -- + [Closes/Fixes #1234 - if this closes or fixes a github issue] + [Bug: URL to source of the report or more related discussion] + [Reported-by: John Doe - credit the reporter] + [whatever-else-by: credit all helpers, finders, doers] + ---- stop ---- + +Don't forget to use commit --author="" if you commit someone else's work, and +make sure that you have your own user and email setup correctly in git before +you commit + +### Write Access to git Repository + +If you are a very frequent contributor, you may be given push access to the +git repository and then you'll be able to push your changes straight into the +git repo instead of sending changes as pull requests or by mail as patches. + +Just ask if this is what you'd want. You will be required to have posted +several high quality patches first, before you can be granted push access. + +### How To Make a Patch with git + +You need to first checkout the repository: + + git clone https://github.com/curl/curl.git + +You then proceed and edit all the files you like and you commit them to your +local repository: + + git commit [file] + +As usual, group your commits so that you commit all changes at once that +constitute a logical change. + +Once you have done all your commits and you're happy with what you see, you +can make patches out of your changes that are suitable for mailing: + + git format-patch remotes/origin/master + +This creates files in your local directory named NNNN-[name].patch for each +commit. + +Now send those patches off to the curl-library list. You can of course opt to +do that with the 'git send-email' command. + +### How To Make a Patch without git + +Keep a copy of the unmodified curl sources. Make your changes in a separate +source tree. When you think you have something that you want to offer the +curl community, use GNU diff to generate patches. + +If you have modified a single file, try something like: + + diff -u unmodified-file.c my-changed-one.c > my-fixes.diff + +If you have modified several files, possibly in different directories, you +can use diff recursively: + + diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff + +The GNU diff and GNU patch tools exist for virtually all platforms, including +all kinds of Unixes and Windows: + +For unix-like operating systems: + + - [https://savannah.gnu.org/projects/patch/](https://savannah.gnu.org/projects/patch/) + - [https://www.gnu.org/software/diffutils/](https://www.gnu.org/software/diffutils/) + +For Windows: + + - [https://gnuwin32.sourceforge.io/packages/patch.htm](https://gnuwin32.sourceforge.io/packages/patch.htm) + - [https://gnuwin32.sourceforge.io/packages/diffutils.htm](https://gnuwin32.sourceforge.io/packages/diffutils.htm) diff --git a/docs/CURL-DISABLE.md b/docs/CURL-DISABLE.md new file mode 100644 index 0000000000..83436b473d --- /dev/null +++ b/docs/CURL-DISABLE.md @@ -0,0 +1,110 @@ +# Code defines to disable features and protocols + +## CURL_DISABLE_COOKIES + +Disable support for HTTP cookies. + +## CURL_DISABLE_CRYPTO_AUTH + +Disable support for authentication methods using crypto. + +## CURL_DISABLE_DICT + +Disable the DICT protocol + +## CURL_DISABLE_DOH + +Disable DNS-over-HTTPS + +## CURL_DISABLE_FILE + +Disable the FILE protocol + +## CURL_DISABLE_FTP + +Disable the FTP (and FTPS) protocol + +## CURL_DISABLE_GOPHER + +Disable the GOPHER protocol. + +## CURL_DISABLE_HTTP + +Disable the HTTP(S) protocols. Note that this then also disable HTTP proxy +support. + +## CURL_DISABLE_HTTP_AUTH + +Disable support for all HTTP authentication methods. + +## CURL_DISABLE_IMAP + +Disable the IMAP(S) protocols. + +## CURL_DISABLE_LDAP + +Disable the LDAP(S) protocols. + +## CURL_DISABLE_LDAPS + +Disable the LDAPS protocol. + +## CURL_DISABLE_LIBCURL_OPTION + +Disable the --libcurl option from the curl tool. + +## CURL_DISABLE_MIME + +Disable MIME support. + +## CURL_DISABLE_NETRC + +Disable the netrc parser. + +## CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG + +Disable the auto load config support in the OpenSSL backend. + +## CURL_DISABLE_PARSEDATE + +Disable date parsing + +## CURL_DISABLE_POP + +Disable the POP(S) protocols + +## CURL_DISABLE_PROGRESS_METER + +Disable the built-in progress meter + +## CURL_DISABLE_PROXY + +Disable support for proxies + +## CURL_DISABLE_RTSP + +Disable the RTSP protocol. + +## CURL_DISABLE_SHUFFLE_DNS + +Disable the shuffle DNS feature + +## CURL_DISABLE_SMB + +Disable the SMB(S) protocols + +## CURL_DISABLE_SMTP + +Disable the SMTP(S) protocols + +## CURL_DISABLE_TELNET + +Disable the TELNET protocol + +## CURL_DISABLE_TFTP + +Disable the TFTP protocol + +## CURL_DISABLE_VERBOSE_STRINGS + +Disable verbose strings and error messages. diff --git a/docs/DEPRECATE.md b/docs/DEPRECATE.md new file mode 100644 index 0000000000..26877c48aa --- /dev/null +++ b/docs/DEPRECATE.md @@ -0,0 +1,12 @@ +# Items to be removed from future curl releases + +If any of these deprecated features is a cause for concern for you, please +email the curl-library mailing list as soon as possible and explain to us why +this is a problem for you and how your use case can't be satisfied properly +using a work around. + +## Past removals + + - Pipelining + - axTLS + - PolarSSL diff --git a/docs/ESNI.md b/docs/ESNI.md new file mode 100644 index 0000000000..7feaa75ad2 --- /dev/null +++ b/docs/ESNI.md @@ -0,0 +1,139 @@ +# TLS: ESNI support in curl and libcurl + +## Summary + +**ESNI** means **Encrypted Server Name Indication**, a TLS 1.3 +extension which is currently the subject of an +[IETF Draft][tlsesni]. + +This file is intended to show the latest current state of ESNI support +in **curl** and **libcurl**. + +At end of August 2019, an [experimental fork of curl][niallorcurl], +built using an [experimental fork of OpenSSL][sftcdopenssl], which in +turn provided an implementation of ESNI, was demonstrated +interoperating with a server belonging to the [DEfO +Project][defoproj]. + +Further sections here describe + +- resources needed for building and demonstrating **curl** support + for ESNI, + +- progress to date, + +- TODO items, and + +- additional details of specific stages of the progress. + +## Resources needed + +To build and demonstrate ESNI support in **curl** and/or **libcurl**, +you will need + +- a TLS library, supported by **libcurl**, which implements ESNI; + +- an edition of **curl** and/or **libcurl** which supports the ESNI + implementation of the chosen TLS library; + +- an environment for building and running **curl**, and at least + building **OpenSSL**; + +- a server, supporting ESNI, against which to run a demonstration + and perhaps a specific target URL; + +- some instructions. + +The following set of resources is currently known to be available. + +| Set | Component | Location | Remarks | +|:-----|:-------------|:------------------------------|:-------------------------------------------| +| DEfO | TLS library | [sftcd/openssl][sftcdopenssl] | Tag *esni-2019-08-30* avoids bleeding edge | +| | curl fork | [niallor/curl][niallorcurl] | Tag *esni-2019-08-30* likewise | +| | instructions | [ESNI-README][niallorreadme] | | + +## Progress + +### PR 4011 (Jun 2019) expected in curl release 7.67.0 (Oct 2019) + +- Details [below](#pr4011); + +- New **curl** feature: `CURL_VERSION_ESNI`; + +- New configuration option: `--enable-esni`; + +- Build-time check for availability of resources needed for ESNI + support; + +- Pre-processor symbol `USE_ESNI` for conditional compilation of + ESNI support code, subject to configuration option and + availability of needed resources. + +## TODO + +- (next PR) Add libcurl options to set ESNI parameters. + +- (next PR) Add curl tool command line options to set ESNI parameters. + +- (WIP) Extend DoH functions so that published ESNI parameters can be + retrieved from DNS instead of being required as options. + +- (WIP) Work with OpenSSL community to finalize ESNI API. + +- Track OpenSSL ESNI API in libcurl + +- Identify and implement any changes needed for CMake. + +- Optimize build-time checking of available resources. + +- Encourage ESNI support work on other TLS/SSL backends. + +## Additional detail + +### PR 4011 + +**TLS: Provide ESNI support framework for curl and libcurl** + +The proposed change provides a framework to facilitate work to +implement ESNI support in curl and libcurl. It is not intended +either to provide ESNI functionality or to favour any particular +TLS-providing backend. Specifically, the change reserves a +feature bit for ESNI support (symbol `CURL_VERSION_ESNI`), +implements setting and reporting of this bit, includes dummy +book-keeping for the symbol, adds a build-time configuration +option (`--enable-esni`), provides an extensible check for +resources available to provide ESNI support, and defines a +compiler pre-processor symbol (`USE_ESNI`) accordingly. + +Proposed-by: @niallor (Niall O'Reilly)\ +Encouraged-by: @sftcd (Stephen Farrell)\ +See-also: [this message](https://curl.haxx.se/mail/lib-2019-05/0108.html) + +Limitations: +- Book-keeping (symbols-in-versions) needs real release number, not 'DUMMY'. + +- Framework is incomplete, as it covers autoconf, but not CMake. + +- Check for available resources, although extensible, refers only to + specific work in progress ([described + here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to + implement ESNI for OpenSSL, as this is the immediate motivation + for the proposed change. + +## References + +Cloudflare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug] + +Cloudflare blog: [Encrypt it or lose it: how encrypted SNI works][esniworks] + +IETF Draft: [Encrypted Server Name Indication for TLS 1.3][tlsesni] + +--- + +[tlsesni]: https://datatracker.ietf.org/doc/draft-ietf-tls-esni/ +[esniworks]: https://blog.cloudflare.com/encrypted-sni/ +[corebug]: https://blog.cloudflare.com/esni/ +[defoproj]: https://defo.ie/ +[sftcdopenssl]: https://github.com/sftcd/openssl/ +[niallorcurl]: https://github.com/niallor/curl/ +[niallorreadme]: https://github.com/niallor/curl/blob/master/ESNI-README.md diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md new file mode 100644 index 0000000000..6c33bcf53c --- /dev/null +++ b/docs/EXPERIMENTAL.md @@ -0,0 +1,22 @@ +# Experimental + +Some features and functionality in curl and libcurl are considered +**EXPERIMENTAL**. + +Experimental support in curl means: + +1. Experimental features are provided to allow users to try them out and + provide feedback on functionality and API etc before they ship and get + "carved in stone". +2. You must enable the feature when invoking configure as otherwise curl will + not be built with the feature present. +3. We strongly advice against using this feature in production. +4. **We reserve the right to change behavior** of the feature without sticking + to our API/ABI rules as we do for regular features, as long as it is marked + experimental. +5. Experimental features are clearly marked so in documentation. Beware. + +## Experimental features right now + + - HTTP/3 support and options + - alt-svc support and options diff --git a/docs/FAQ b/docs/FAQ new file mode 100644 index 0000000000..53f1c9e7a5 --- /dev/null +++ b/docs/FAQ @@ -0,0 +1,1558 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FAQ + + 1. Philosophy + 1.1 What is cURL? + 1.2 What is libcurl? + 1.3 What is curl not? + 1.4 When will you make curl do XXXX ? + 1.5 Who makes curl? + 1.6 What do you get for making curl? + 1.7 What about CURL from curl.com? + 1.8 I have a problem who do I mail? + 1.9 Where do I buy commercial support for curl? + 1.10 How many are using curl? + 1.11 Why don't you update ca-bundle.crt + 1.12 I have a problem who can I chat with? + 1.13 curl's ECCN number? + 1.14 How do I submit my patch? + 1.15 How do I port libcurl to my OS? + + 2. Install Related Problems + 2.1 configure doesn't find OpenSSL even when it is installed + 2.1.1 native linker doesn't find OpenSSL + 2.1.2 only the libssl lib is missing + 2.2 Does curl work/build with other SSL libraries? + 2.3 Where can I find a copy of LIBEAY32.DLL? + 2.4 Does curl support SOCKS (RFC 1928) ? + + 3. Usage Problems + 3.1 curl: (1) SSL is disabled, https: not supported + 3.2 How do I tell curl to resume a transfer? + 3.3 Why doesn't my posting using -F work? + 3.4 How do I tell curl to run custom FTP commands? + 3.5 How can I disable the Accept: */* header? + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + 3.7 Can I use curl to delete/rename a file through FTP? + 3.8 How do I tell curl to follow HTTP redirects? + 3.9 How do I use curl in my favorite programming language? + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + 3.11 How do I POST with a different Content-Type? + 3.12 Why do FTP-specific features over HTTP proxy fail? + 3.13 Why do my single/double quotes fail? + 3.14 Does curl support Javascript or PAC (automated proxy config)? + 3.15 Can I do recursive fetches with curl? + 3.16 What certificates do I need when I use SSL? + 3.17 How do I list the root dir of an FTP server? + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + 3.19 How do I get HTTP from a host using a specific IP address? + 3.20 How to SFTP from my user's home directory? + 3.21 Protocol xxx not supported or disabled in libcurl + 3.22 curl -X gives me HTTP problems + + 4. Running Problems + 4.1 Problems connecting to SSL servers. + 4.2 Why do I get problems when I use & or % in the URL? + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + 4.4 Why do I get downloaded data even though the web page doesn't exist? + 4.5 Why do I get return code XXX from a HTTP server? + 4.5.1 "400 Bad Request" + 4.5.2 "401 Unauthorized" + 4.5.3 "403 Forbidden" + 4.5.4 "404 Not Found" + 4.5.5 "405 Method Not Allowed" + 4.5.6 "301 Moved Permanently" + 4.6 Can you tell me what error code 142 means? + 4.7 How do I keep user names and passwords secret in Curl command lines? + 4.8 I found a bug! + 4.9 Curl can't authenticate to the server that requires NTLM? + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + 4.11 Why do my HTTP range requests return the full document? + 4.12 Why do I get "certificate verify failed" ? + 4.13 Why is curl -R on Windows one hour off? + 4.14 Redirects work in browser but not with curl! + 4.15 FTPS doesn't work + 4.16 My HTTP POST or PUT requests are slow! + 4.17 Non-functional connect timeouts on Windows + 4.18 file:// URLs containing drive letters (Windows, NetWare) + 4.19 Why doesn't curl return an error when the network cable is unplugged? + 4.20 curl doesn't return error for HTTP non-200 responses! + 4.21 Why is there a HTTP/1.1 in my HTTP/2 request? + + 5. libcurl Issues + 5.1 Is libcurl thread-safe? + 5.2 How can I receive all data into a large memory chunk? + 5.3 How do I fetch multiple files with libcurl? + 5.4 Does libcurl do Winsock initing on win32 systems? + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + 5.6 What about Keep-Alive or persistent connections? + 5.7 Link errors when building libcurl on Windows! + 5.8 libcurl.so.X: open failed: No such file or directory + 5.9 How does libcurl resolve host names? + 5.10 How do I prevent libcurl from writing the response to stdout? + 5.11 How do I make libcurl not receive the whole HTTP response? + 5.12 Can I make libcurl fake or hide my real IP address? + 5.13 How do I stop an ongoing transfer? + 5.14 Using C++ non-static functions for callbacks? + 5.15 How do I get an FTP directory listing? + 5.16 I want a different time-out! + 5.17 Can I write a server with libcurl? + 5.18 Does libcurl use threads? + + 6. License Issues + 6.1 I have a GPL program, can I use the libcurl library? + 6.2 I have a closed-source program, can I use the libcurl library? + 6.3 I have a BSD licensed program, can I use the libcurl library? + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + 6.6 Can you please change the curl/libcurl license to XXXX? + 6.7 What are my obligations when using libcurl in my commercial apps? + + 7. PHP/CURL Issues + 7.1 What is PHP/CURL? + 7.2 Who wrote PHP/CURL? + 7.3 Can I perform multiple requests using the same handle? + 7.4 Does PHP/CURL have dependencies? + +============================================================================== + +1. Philosophy + + 1.1 What is cURL? + + cURL is the name of the project. The name is a play on 'Client for URLs', + originally with URL spelled in uppercase to make it obvious it deals with + URLs. The fact it can also be pronounced 'see URL' also helped, it works as + an abbreviation for "Client URL Request Library" or why not the recursive + version: "Curl URL Request Library". + + The cURL project produces two products: + + libcurl + + A free and easy-to-use client-side URL transfer library, supporting DICT, + FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, + POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. + + libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, + Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password + authentication, file transfer resume, http proxy tunneling and more! + + libcurl is highly portable, it builds and works identically on numerous + platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HP-UX, + IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOS, Mac + OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS, Symbian, OSF, + Android, Minix, IBM TPF and more... + + libcurl is free, thread-safe, IPv6 compatible, feature rich, well + supported and fast. + + curl + + A command line tool for getting or sending files using URL syntax. + + Since curl uses libcurl, curl supports the same wide range of common + Internet protocols that libcurl does. + + We pronounce curl with an initial k sound. It rhymes with words like girl + and earl. This is a short WAV file to help you: + + https://media.merriam-webster.com/soundc11/c/curl0001.wav + + There are numerous sub-projects and related projects that also use the word + curl in the project names in various combinations, but you should take + notice that this FAQ is directed at the command-line tool named curl (and + libcurl the library), and may therefore not be valid for other curl-related + projects. (There is however a small section for the PHP/CURL in this FAQ.) + + 1.2 What is libcurl? + + libcurl is a reliable and portable library which provides you with an easy + interface to a range of common Internet protocols. + + You can use libcurl for free in your application, be it open source, + commercial or closed-source. + + libcurl is most probably the most portable, most powerful and most often + used C-based multi-platform file transfer library on this planet - be it + open source or commercial. + + 1.3 What is curl not? + + Curl is not a wget clone. That is a common misconception. Never, during + curl's development, have we intended curl to replace wget or compete on its + market. Curl is targeted at single-shot file transfers. + + Curl is not a web site mirroring program. If you want to use curl to mirror + something: fine, go ahead and write a script that wraps around curl to make + it reality (like curlmirror.pl does). + + Curl is not an FTP site mirroring program. Sure, get and send FTP with curl + but if you want systematic and sequential behavior you should write a + script (or write a new program that interfaces libcurl) and do it. + + Curl is not a PHP tool, even though it works perfectly well when used from + or with PHP (when using the PHP/CURL module). + + Curl is not a program for a single operating system. Curl exists, compiles, + builds and runs under a wide range of operating systems, including all + modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2, + OS X, QNX etc. + + 1.4 When will you make curl do XXXX ? + + We love suggestions of what to change in order to make curl and libcurl + better. We do however believe in a few rules when it comes to the future of + curl: + + Curl -- the command line tool -- is to remain a non-graphical command line + tool. If you want GUIs or fancy scripting capabilities, you should look for + another tool that uses libcurl. + + We do not add things to curl that other small and available tools already do + very well at the side. Curl's output can be piped into another program or + redirected to another file for the next program to interpret. + + We focus on protocol related issues and improvements. If you want to do more + magic with the supported protocols than curl currently does, chances are good + we will agree. If you want to add more protocols, we may very well agree. + + If you want someone else to do all the work while you wait for us to + implement it for you, that is not a very friendly attitude. We spend a + considerable time already on maintaining and developing curl. In order to + get more out of us, you should consider trading in some of your time and + effort in return. Simply go to the GitHub repo which resides at + https://github.com/curl/curl, fork the project, and create pull requests + with your proposed changes. + + If you write the code, chances are better that it will get into curl faster. + + 1.5 Who makes curl? + + curl and libcurl are not made by any single individual. Daniel Stenberg is + project leader and main developer, but other persons' submissions are + important and crucial. Anyone can contribute and post their changes and + improvements and have them inserted in the main sources (of course on the + condition that developers agree that the fixes are good). + + The full list of all contributors is found in the docs/THANKS file. + + curl is developed by a community, with Daniel at the wheel. + + 1.6 What do you get for making curl? + + Project cURL is entirely free and open. No person gets paid for developing + curl full time. We do this voluntarily, mostly in our spare time. + Occasionally companies pay individual developers to work on curl, but that's + up to each company and developer. This is not controlled by nor supervised in + any way by the project. + + We still get help from companies. Haxx provides web site, bandwidth, mailing + lists etc, GitHub hosts the primary git repository and other services like + the bug tracker at https://github.com/curl/curl. Also again, some companies + have sponsored certain parts of the development in the past and I hope some + will continue to do so in the future. + + If you want to support our project, consider a donation or a banner-program + or even better: by helping us with coding, documenting or testing etc. + + 1.7 What about CURL from curl.com? + + During the summer of 2001, curl.com was busy advertising their client-side + programming language for the web, named CURL. + + We are in no way associated with curl.com or their CURL programming + language. + + Our project name curl has been in effective use since 1998. We were not the + first computer related project to use the name "curl" and do not claim any + rights to the name. + + We recognize that we will be living in parallel with curl.com and wish them + every success. + + 1.8 I have a problem whom do I mail? + + Please do not mail any single individual unless you really need to. Keep + curl-related questions on a suitable mailing list. All available mailing + lists are listed in the MANUAL document and online at + https://curl.haxx.se/mail/ + + Keeping curl-related questions and discussions on mailing lists allows + others to join in and help, to share their ideas, to contribute their + suggestions and to spread their wisdom. Keeping discussions on public mailing + lists also allows for others to learn from this (both current and future + users thanks to the web based archives of the mailing lists), thus saving us + from having to repeat ourselves even more. Thanks for respecting this. + + If you have found or simply suspect a security problem in curl or libcurl, + mail curl-security at haxx.se (closed list of receivers, mails are not + disclosed) and tell. Then we can produce a fix in a timely manner before the + flaw is announced to the world, thus lessen the impact the problem will have + on existing users. + + 1.9 Where do I buy commercial support for curl? + + curl is fully open source. It means you can hire any skilled engineer to fix + your curl-related problems. + + We list available alternatives on the curl web site: + https://curl.haxx.se/support.html + + 1.10 How many are using curl? + + It is impossible to tell. + + We don't know how many users that knowingly have installed and use curl. + + We don't know how many users that use curl without knowing that they are in + fact using it. + + We don't know how many users that downloaded or installed curl and then + never use it. + + In May 2012 Daniel did a counting game and came up with a number that may + be completely wrong or somewhat accurate. Over 500 million! + + See https://daniel.haxx.se/blog/2012/05/16/300m-users/ + + 1.11 Why don't you update ca-bundle.crt + + The ca cert bundle that used to be shipped with curl was very outdated and + must be replaced with an up-to-date version by anyone who wants to verify + peers. It is no longer provided by curl. The last curl release that ever + shipped a ca cert bundle was curl 7.18.0. + + In the cURL project we've decided not to attempt to keep this file updated + (or even present anymore) since deciding what to add to a ca cert bundle is + an undertaking we've not been ready to accept, and the one we can get from + Mozilla is perfectly fine so there's no need to duplicate that work. + + Today, with many services performed over HTTPS, every operating system + should come with a default ca cert bundle that can be deemed somewhat + trustworthy and that collection (if reasonably updated) should be deemed to + be a lot better than a private curl version. + + If you want the most recent collection of ca certs that Mozilla Firefox + uses, we recommend that you extract the collection yourself from Mozilla + Firefox (by running 'make ca-bundle), or by using our online service setup + for this purpose: https://curl.haxx.se/docs/caextract.html + + 1.12 I have a problem who can I chat with? + + There's a bunch of friendly people hanging out in the #curl channel on the + IRC network irc.freenode.net. If you're polite and nice, chances are good + that you can get -- or provide -- help instantly. + + 1.13 curl's ECCN number? + + The US government restricts exports of software that contains or uses + cryptography. When doing so, the Export Control Classification Number (ECCN) + is used to identify the level of export control etc. + + Apache Software Foundation gives a good explanation of ECCNs at + https://www.apache.org/dev/crypto.html + + We believe curl's number might be ECCN 5D002, another possibility is + 5D992. It seems necessary to write them (the authority that administers ECCN + numbers), asking to confirm. + + Comprehensible explanations of the meaning of such numbers and how to obtain + them (resp.) are here + + https://www.bis.doc.gov/licensing/exportingbasics.htm + https://www.bis.doc.gov/licensing/do_i_needaneccn.html + + An incomprehensible description of the two numbers above is here + https://www.bis.doc.gov/index.php/documents/new-encryption/1653-ccl5-pt2-3 + + 1.14 How do I submit my patch? + + When you have made a patch or a change of whatever sort, and want to submit + that to the project, there are a few different ways we prefer: + + o send a patch to the curl-library mailing list. We're many subscribers + there and there are lots of people who can review patches, comment on them + and "receive" them properly. + + o if your patch changes or fixes a bug, you can also opt to submit a bug + report in the bug tracker and attach your patch there. There are less + people involved there. + + Lots of more details are found in the CONTRIBUTE and INTERNALS docs. + + 1.15 How do I port libcurl to my OS? + + Here's a rough step-by-step: + + 1. copy a suitable lib/config-*.h file as a start to lib/config-[youros].h + + 2. edit lib/config-[youros].h to match your OS and setup + + 3. edit lib/curl_setup.h to include config-[youros].h when your OS is + detected by the preprocessor, in the style others already exist + + 4. compile lib/*.c and make them into a library + + +2. Install Related Problems + + 2.1 configure doesn't find OpenSSL even when it is installed + + This may be because of several reasons. + + 2.1.1 native linker doesn't find openssl + + Affected platforms: + Solaris (native cc compiler) + HPUX (native cc compiler) + SGI IRIX (native cc compiler) + SCO UNIX (native cc compiler) + + When configuring curl, I specify --with-ssl. OpenSSL is installed in + /usr/local/ssl Configure reports SSL in /usr/local/ssl, but fails to find + CRYPTO_lock in -lcrypto + + Cause: The cc for this test places the -L/usr/local/ssl/lib AFTER + -lcrypto, so ld can't find the library. This is due to a bug in the GNU + autoconf tool. + + Workaround: Specifying "LDFLAGS=-L/usr/local/ssl/lib" in front of + ./configure places the -L/usr/local/ssl/lib early enough in the command + line to make things work + + 2.1.2 only the libssl lib is missing + + If all include files and the libcrypto lib is present, with only the + libssl being missing according to configure, this is most likely because + a few functions are left out from the libssl. + + If the function names missing include RSA or RSAREF you can be certain + that this is because libssl requires the RSA and RSAREF libs to build. + + See the INSTALL file section that explains how to add those libs to + configure. Make sure that you remove the config.cache file before you + rerun configure with the new flags. + + 2.2 Does curl work/build with other SSL libraries? + + Curl has been written to use a generic SSL function layer internally, and + that SSL functionality can then be provided by one out of many different SSL + backends. + + curl can be built to use one of the following SSL alternatives: OpenSSL, + libressl, BoringSSL, GnuTLS, wolfSSL, NSS, mbedTLS, MesaLink, Secure + Transport (native iOS/OS X), Schannel (native Windows), GSKit (native IBM + i), or BearSSL. They all have their pros and cons, and we try to maintain a + comparison of them here: https://curl.haxx.se/docs/ssl-compared.html + + 2.3 Where can I find a copy of LIBEAY32.DLL? + + That is an OpenSSL binary built for Windows. + + Curl can be built with OpenSSL to do the SSL stuff. The LIBEAY32.DLL is then + what curl needs on a windows machine to do https:// etc. Check out the curl + web site to find accurate and up-to-date pointers to recent OpenSSL DLLs and + other binary packages. + + 2.4 Does curl support SOCKS (RFC 1928) ? + + Yes, SOCKS 4 and 5 are supported. + + +3. Usage problems + + 3.1 curl: (1) SSL is disabled, https: not supported + + If you get this output when trying to get anything from a https:// server, + it means that the instance of curl/libcurl that you're using was built + without support for this protocol. + + This could've happened if the configure script that was run at build time + couldn't find all libs and include files curl requires for SSL to work. If + the configure script fails to find them, curl is simply built without SSL + support. + + To get the https:// support into a curl that was previously built but that + reports that https:// is not supported, you should dig through the document + and logs and check out why the configure script doesn't find the SSL libs + and/or include files. + + Also, check out the other paragraph in this FAQ labeled "configure doesn't + find OpenSSL even when it is installed". + + 3.2 How do I tell curl to resume a transfer? + + Curl supports resumed transfers both ways on both FTP and HTTP. + Try the -C option. + + 3.3 Why doesn't my posting using -F work? + + You can't arbitrarily use -F or -d, the choice between -F or -d depends on the + HTTP operation you need curl to do and what the web server that will receive + your post expects. + + If the form you're trying to submit uses the type 'multipart/form-data', then + and only then you must use the -F type. In all the most common cases, you + should use -d which then causes a posting with the type + 'application/x-www-form-urlencoded'. + + This is described in some detail in the MANUAL and TheArtOfHttpScripting + documents, and if you don't understand it the first time, read it again + before you post questions about this to the mailing list. Also, try reading + through the mailing list archives for old postings and questions regarding + this. + + 3.4 How do I tell curl to run custom FTP commands? + + You can tell curl to perform optional commands both before and/or after a + file transfer. Study the -Q/--quote option. + + Since curl is used for file transfers, you don't normally use curl to + perform FTP commands without transferring anything. Therefore you must + always specify a URL to transfer to/from even when doing custom FTP + commands, or use -I which implies the "no body" option sent to libcurl. + + 3.5 How can I disable the Accept: */* header? + + You can change all internally generated headers by adding a replacement with + the -H/--header option. By adding a header with empty contents you safely + disable that one. Use -H "Accept:" to disable that specific header. + + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + + To curl, all contents are alike. It doesn't matter how the page was + generated. It may be ASP, PHP, Perl, shell-script, SSI or plain HTML + files. There's no difference to curl and it doesn't even know what kind of + language that generated the page. + + See also item 3.14 regarding javascript. + + 3.7 Can I use curl to delete/rename a file through FTP? + + Yes. You specify custom FTP commands with -Q/--quote. + + One example would be to delete a file after you have downloaded it: + + curl -O ftp://download.com/coolfile -Q '-DELE coolfile' + + or rename a file after upload: + + curl -T infile ftp://upload.com/dir/ -Q "-RNFR infile" -Q "-RNTO newname" + + 3.8 How do I tell curl to follow HTTP redirects? + + Curl does not follow so-called redirects by default. The Location: header + that informs the client about this is only interpreted if you're using the + -L/--location option. As in: + + curl -L http://redirector.com + + Not all redirects are HTTP ones, see 4.14 + + 3.9 How do I use curl in my favorite programming language? + + Many programming languages have interfaces/bindings that allow you to use + curl without having to use the command line tool. If you are fluent in such + a language, you may prefer to use one of these interfaces instead. + + Find out more about which languages that support curl directly, and how to + install and use them, in the libcurl section of the curl web site: + https://curl.haxx.se/libcurl/ + + All the various bindings to libcurl are made by other projects and people, + outside of the cURL project. The cURL project itself only produces libcurl + with its plain C API. If you don't find anywhere else to ask you can ask + about bindings on the curl-library list too, but be prepared that people on + that list may not know anything about bindings. + + In February 2019, there were interfaces available for the following + languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Delphi, Dylan, Eiffel, + Euphoria, Falcon, Ferite, Gambas, glib/GTK+, Go, Guile, Harbour, Haskell, + Java, Julia, Lisp, Lua, Mono, .NET, node.js, Object-Pascal, OCaml, Pascal, + Perl, PHP, PostgreSQL, Python, R, Rexx, Ring, RPG, Ruby, Rust, Scheme, + Scilab, S-Lang, Smalltalk, SP-Forth, SPL, Tcl, Visual Basic, Visual FoxPro, + Q, wxwidgets, XBLite and Xoho. By the time you read this, additional ones + may have appeared! + + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + + Curl adheres to the HTTP spec, which basically means you can play with *any* + protocol that is built on top of HTTP. Protocols such as SOAP, WEBDAV and + XML-RPC are all such ones. You can use -X to set custom requests and -H to + set custom headers (or replace internally generated ones). + + Using libcurl is of course just as good and you'd just use the proper + library options to do the same. + + 3.11 How do I POST with a different Content-Type? + + You can always replace the internally generated headers with -H/--header. + To make a simple HTTP POST with text/xml as content-type, do something like: + + curl -d "datatopost" -H "Content-Type: text/xml" [URL] + + 3.12 Why do FTP-specific features over HTTP proxy fail? + + Because when you use a HTTP proxy, the protocol spoken on the network will + be HTTP, even if you specify a FTP URL. This effectively means that you + normally can't use FTP-specific features such as FTP upload and FTP quote + etc. + + There is one exception to this rule, and that is if you can "tunnel through" + the given HTTP proxy. Proxy tunneling is enabled with a special option (-p) + and is generally not available as proxy admins usually disable tunneling to + ports other than 443 (which is used for HTTPS access through proxies). + + 3.13 Why do my single/double quotes fail? + + To specify a command line option that includes spaces, you might need to + put the entire option within quotes. Like in: + + curl -d " with spaces " url.com + + or perhaps + + curl -d ' with spaces ' url.com + + Exactly what kind of quotes and how to do this is entirely up to the shell + or command line interpreter that you are using. For most unix shells, you + can more or less pick either single (') or double (") quotes. For + Windows/DOS prompts I believe you're forced to use double (") quotes. + + Please study the documentation for your particular environment. Examples in + the curl docs will use a mix of both of these as shown above. You must + adjust them to work in your environment. + + Remember that curl works and runs on more operating systems than most single + individuals have ever tried. + + 3.14 Does curl support Javascript or PAC (automated proxy config)? + + Many web pages do magic stuff using embedded Javascript. Curl and libcurl + have no built-in support for that, so it will be treated just like any other + contents. + + .pac files are a netscape invention and are sometimes used by organizations + to allow them to differentiate which proxies to use. The .pac contents is + just a Javascript program that gets invoked by the browser and that returns + the name of the proxy to connect to. Since curl doesn't support Javascript, + it can't support .pac proxy configuration either. + + Some workarounds usually suggested to overcome this Javascript dependency: + + 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. + + 3.15 Can I do recursive fetches with curl? + + No. curl itself has no code that performs recursive operations, such as + those performed by wget and similar tools. + + There exists wrapper scripts with that functionality (for example the + curlmirror perl script), and you can write programs based on libcurl to do + it, but the command line tool curl itself cannot. + + 3.16 What certificates do I need when I use SSL? + + There are three different kinds of "certificates" to keep track of when we + talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl. + + CLIENT CERTIFICATE + + The server you communicate with may require that you can provide this in + order to prove that you actually are who you claim to be. If the server + doesn't require this, you don't need a client certificate. + + A client certificate is always used together with a private key, and the + private key has a pass phrase that protects it. + + SERVER CERTIFICATE + + The server you communicate with has a server certificate. You can and should + verify this certificate to make sure that you are truly talking to the real + server and not a server impersonating it. + + CERTIFICATE AUTHORITY CERTIFICATE ("CA cert") + + You often have several CA certs in a CA cert bundle that can be used to + verify a server certificate that was signed by one of the authorities in the + bundle. curl does not come with a CA cert bundle but most curl installs + provide one. You can also override the default. + + The server certificate verification process is made by using a Certificate + Authority certificate ("CA cert") that was used to sign the server + certificate. Server certificate verification is enabled by default in curl + and libcurl and is often the reason for problems as explained in FAQ entry + 4.12 and the SSLCERTS document + (https://curl.haxx.se/docs/sslcerts.html). Server certificates that are + "self-signed" or otherwise signed by a CA that you do not have a CA cert + for, cannot be verified. If the verification during a connect fails, you are + refused access. You then need to explicitly disable the verification to + connect to the server. + + 3.17 How do I list the root dir of an FTP server? + + There are two ways. The way defined in the RFC is to use an encoded slash + in the first path part. List the "/tmp" dir like this: + + curl ftp://ftp.sunet.se/%2ftmp/ + + or the not-quite-kosher-but-more-readable way, by simply starting the path + section of the URL with a slash: + + curl ftp://ftp.sunet.se//tmp/ + + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + + No. + + But you could easily write your own program using libcurl to do such stunts. + + 3.19 How do I get HTTP from a host using a specific IP address? + + For example, you may be trying out a web site installation that isn't yet in + the DNS. Or you have a site using multiple IP addresses for a given host + name and you want to address a specific one out of the set. + + Set a custom Host: header that identifies the server name you want to reach + but use the target IP address in the URL: + + curl --header "Host: www.example.com" http://127.0.0.1/ + + You can also opt to add faked host name entries to curl with the --resolve + option. That has the added benefit that things like redirects will also work + properly. The above operation would instead be done as: + + curl --resolve www.example.com:80:127.0.0.1 http://www.example.com/ + + 3.20 How to SFTP from my user's home directory? + + Contrary to how FTP works, SFTP and SCP URLs specify the exact directory to + work with. It means that if you don't specify that you want the user's home + directory, you get the actual root directory. + + To specify a file in your user's home directory, you need to use the correct + URL syntax which for SFTP might look similar to: + + curl -O -u user:password sftp://example.com/~/file.txt + + and for SCP it is just a different protocol prefix: + + curl -O -u user:password scp://example.com/~/file.txt + + 3.21 Protocol xxx not supported or disabled in libcurl + + When passing on a URL to curl to use, it may respond that the particular + protocol is not supported or disabled. The particular way this error message + is phrased is because curl doesn't make a distinction internally of whether + a particular protocol is not supported (i.e. never got any code added that + knows how to speak that protocol) or if it was explicitly disabled. curl can + be built to only support a given set of protocols, and the rest would then + be disabled or not supported. + + Note that this error will also occur if you pass a wrongly spelled protocol + part as in "htpt://example.com" or as in the less evident case if you prefix + the protocol part with a space as in " http://example.com/". + + 3.22 curl -X gives me HTTP problems + + In normal circumstances, -X should hardly ever be used. + + By default you use curl without explicitly saying which request method to + use when the URL identifies a HTTP transfer. If you just pass in a URL like + "curl http://example.com" it will use GET. If you use -d or -F curl will use + POST, -I will cause a HEAD and -T will make it a PUT. + + If for whatever reason you're not happy with these default choices that curl + does for you, you can override those request methods by specifying -X + [WHATEVER]. This way you can for example send a DELETE by doing "curl -X + DELETE [URL]". + + It is thus pointless to do "curl -XGET [URL]" as GET would be used + anyway. In the same vein it is pointless to do "curl -X POST -d data + [URL]"... But you can make a fun and somewhat rare request that sends a + request-body in a GET request with something like "curl -X GET -d data + [URL]" + + Note that -X doesn't actually change curl's behavior as it only modifies the + actual string sent in the request, but that may of course trigger a + different set of events. + + Accordingly, by using -XPOST on a command line that for example would follow + a 303 redirect, you will effectively prevent curl from behaving + correctly. Be aware. + + +4. Running Problems + + 4.1 Problems connecting to SSL servers. + + It took a very long time before we could sort out why curl had problems to + connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The + error sometimes showed up similar to: + + 16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233: + + It turned out to be because many older SSL servers don't deal with SSLv3 + requests properly. To correct this problem, tell curl to select SSLv2 from + the command line (-2/--sslv2). + + There have also been examples where the remote server didn't like the SSLv2 + request and instead you had to force curl to use SSLv3 with -3/--sslv3. + + 4.2 Why do I get problems when I use & or % in the URL? + + In general unix shells, the & symbol is treated specially and when used, it + runs the specified command in the background. To safely send the & as a part + of a URL, you should quote the entire URL by using single (') or double (") + quotes around it. Similar problems can also occur on some shells with other + characters, including ?*!$~(){}<>\|;`. When in doubt, quote the URL. + + An example that would invoke a remote CGI that uses &-symbols could be: + + curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl' + + In Windows, the standard DOS shell treats the percent sign specially and you + need to use TWO percent signs for each single one you want to use in the + URL. + + If you want a literal percent sign to be part of the data you pass in a POST + using -d/--data you must encode it as '%25' (which then also needs the + percent sign doubled on Windows machines). + + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + + Because those letters have a special meaning to the shell, to be used in + a URL specified to curl you must quote them. + + An example that downloads two URLs (sequentially) would be: + + curl '{curl,www}.haxx.se' + + To be able to use those characters as actual parts of the URL (without using + them for the curl URL "globbing" system), use the -g/--globoff option: + + curl -g 'www.site.com/weirdname[].html' + + 4.4 Why do I get downloaded data even though the web page doesn't exist? + + Curl asks remote servers for the page you specify. If the page doesn't exist + at the server, the HTTP protocol defines how the server should respond and + that means that headers and a "page" will be returned. That's simply how + HTTP works. + + By using the --fail option you can tell curl explicitly to not get any data + if the HTTP return code doesn't say success. + + 4.5 Why do I get return code XXX from a HTTP server? + + RFC2616 clearly explains the return codes. This is a short transcript. Go + read the RFC for exact details: + + 4.5.1 "400 Bad Request" + + The request could not be understood by the server due to malformed + syntax. The client SHOULD NOT repeat the request without modifications. + + 4.5.2 "401 Unauthorized" + + The request requires user authentication. + + 4.5.3 "403 Forbidden" + + The server understood the request, but is refusing to fulfill it. + Authorization will not help and the request SHOULD NOT be repeated. + + 4.5.4 "404 Not Found" + + The server has not found anything matching the Request-URI. No indication + is given of whether the condition is temporary or permanent. + + 4.5.5 "405 Method Not Allowed" + + The method specified in the Request-Line is not allowed for the resource + identified by the Request-URI. The response MUST include an Allow header + containing a list of valid methods for the requested resource. + + 4.5.6 "301 Moved Permanently" + + If you get this return code and an HTML output similar to this: + +

Moved Permanently

The document has moved here. + + it might be because you requested a directory URL but without the trailing + slash. Try the same operation again _with_ the trailing URL, or use the + -L/--location option to follow the redirection. + + 4.6 Can you tell me what error code 142 means? + + All curl error codes are described at the end of the man page, in the + section called "EXIT CODES". + + Error codes that are larger than the highest documented error code means + that curl has exited due to a crash. This is a serious error, and we + appreciate a detailed bug report from you that describes how we could go + ahead and repeat this! + + 4.7 How do I keep user names and passwords secret in Curl command lines? + + This problem has two sides: + + The first part is to avoid having clear-text passwords in the command line + so that they don't appear in 'ps' outputs and similar. That is easily + avoided by using the "-K" option to tell curl to read parameters from a file + or stdin to which you can pass the secret info. curl itself will also + attempt to "hide" the given password by blanking out the option - this + doesn't work on all platforms. + + To keep the passwords in your account secret from the rest of the world is + not a task that curl addresses. You could of course encrypt them somehow to + at least hide them from being read by human eyes, but that is not what + anyone would call security. + + Also note that regular HTTP (using Basic authentication) and FTP passwords + are sent as cleartext across the network. All it takes for anyone to fetch + them is to listen on the network. Eavesdropping is very easy. Use more secure + authentication methods (like Digest, Negotiate or even NTLM) or consider the + SSL-based alternatives HTTPS and FTPS. + + 4.8 I found a bug! + + It is not a bug if the behavior is documented. Read the docs first. + Especially check out the KNOWN_BUGS file, it may be a documented bug! + + If it is a problem with a binary you've downloaded or a package for your + particular platform, try contacting the person who built the package/archive + you have. + + If there is a bug, read the BUGS document first. Then report it as described + in there. + + 4.9 Curl can't authenticate to the server that requires NTLM? + + NTLM support requires OpenSSL, GnuTLS, mbedTLS, NSS, Secure Transport, or + Microsoft Windows libraries at build-time to provide this functionality. + + NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You + should not use such ones. + + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + + Many web servers allow or demand that the administrator configures the + server properly for these requests to work on the web server. + + Some servers seem to support HEAD only on certain kinds of URLs. + + To fully grasp this, try the documentation for the particular server + software you're trying to interact with. This is not anything curl can do + anything about. + + 4.11 Why do my HTTP range requests return the full document? + + Because the range may not be supported by the server, or the server may + choose to ignore it and return the full document anyway. + + 4.12 Why do I get "certificate verify failed" ? + + You invoke curl 7.10 or later to communicate on a https:// URL and get an + error back looking something similar to this: + + curl: (35) SSL: error:14090086:SSL routines: + SSL3_GET_SERVER_CERTIFICATE:certificate verify failed + + Then it means that curl couldn't verify that the server's certificate was + good. Curl verifies the certificate using the CA cert bundle that comes with + the curl installation. + + To disable the verification (which makes it act like curl did before 7.10), + use -k. This does however enable man-in-the-middle attacks. + + If you get this failure but are having a CA cert bundle installed and used, + the server's certificate is not signed by one of the CA's in the bundle. It + might for example be self-signed. You then correct this problem by obtaining + a valid CA cert for the server. Or again, decrease the security by disabling + this check. + + Details are also in the SSLCERTS file in the release archives, found online + here: https://curl.haxx.se/docs/sslcerts.html + + 4.13 Why is curl -R on Windows one hour off? + + Since curl 7.53.0 this issue should be fixed as long as curl was built with + any modern compiler that allows for a 64-bit curl_off_t type. For older + compilers or prior curl versions it may set a time that appears one hour off. + This happens due to a flaw in how Windows stores and uses file modification + times and it is not easily worked around. For more details read this: + https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug-and-getting + + 4.14 Redirects work in browser but not with curl! + + curl supports HTTP redirects well (see item 3.8). Browsers generally support + at least two other ways to perform redirects that curl does not: + + Meta tags. You can write a HTML tag that will cause the browser to redirect + to another given URL after a certain time. + + Javascript. You can write a Javascript program embedded in a HTML page that + redirects the browser to another given URL. + + There is no way to make curl follow these redirects. You must either + manually figure out what the page is set to do, or write a script that parses + the results and fetches the new URL. + + 4.15 FTPS doesn't work + + curl supports FTPS (sometimes known as FTP-SSL) both implicit and explicit + mode. + + When a URL is used that starts with FTPS://, curl assumes implicit SSL on + the control connection and will therefore immediately connect and try to + speak SSL. FTPS:// connections default to port 990. + + To use explicit FTPS, you use a FTP:// URL and the --ftp-ssl option (or one + of its related flavors). This is the most common method, and the one + mandated by RFC4217. This kind of connection will then of course use the + standard FTP port 21 by default. + + 4.16 My HTTP POST or PUT requests are slow! + + libcurl makes all POST and PUT requests (except for POST requests with a + very tiny request body) use the "Expect: 100-continue" header. This header + allows the server to deny the operation early so that libcurl can bail out + before having to send any data. This is useful in authentication + cases and others. + + However, many servers don't implement the Expect: stuff properly and if the + server doesn't respond (positively) within 1 second libcurl will continue + and send off the data anyway. + + You can disable libcurl's use of the Expect: header the same way you disable + any header, using -H / CURLOPT_HTTPHEADER, or by forcing it to use HTTP 1.0. + + 4.17 Non-functional connect timeouts + + In most Windows setups having a timeout longer than 21 seconds make no + difference, as it will only send 3 TCP SYN packets and no more. The second + packet sent three seconds after the first and the third six seconds after + the second. No more than three packets are sent, no matter how long the + timeout is set. + + See option TcpMaxConnectRetransmissions on this page: + https://support.microsoft.com/en-us/kb/175523/en-us + + Also, even on non-Windows systems there may run a firewall or anti-virus + software or similar that accepts the connection but does not actually do + anything else. This will make (lib)curl to consider the connection connected + and thus the connect timeout won't trigger. + + 4.18 file:// URLs containing drive letters (Windows, NetWare) + + When using curl to try to download a local file, one might use a URL + in this format: + + file://D:/blah.txt + + You'll find that even if D:\blah.txt does exist, curl returns a 'file + not found' error. + + According to RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt), + file:// URLs must contain a host component, but it is ignored by + most implementations. In the above example, 'D:' is treated as the + host component, and is taken away. Thus, curl tries to open '/blah.txt'. + If your system is installed to drive C:, that will resolve to 'C:\blah.txt', + and if that doesn't exist you will get the not found error. + + To fix this problem, use file:// URLs with *three* leading slashes: + + file:///D:/blah.txt + + Alternatively, if it makes more sense, specify 'localhost' as the host + component: + + file://localhost/D:/blah.txt + + In either case, curl should now be looking for the correct file. + + 4.19 Why doesn't curl return an error when the network cable is unplugged? + + Unplugging a cable is not an error situation. The TCP/IP protocol stack + was designed to be fault tolerant, so even though there may be a physical + break somewhere the connection shouldn't be affected, just possibly + delayed. Eventually, the physical break will be fixed or the data will be + re-routed around the physical problem through another path. + + In such cases, the TCP/IP stack is responsible for detecting when the + network connection is irrevocably lost. Since with some protocols it is + perfectly legal for the client to wait indefinitely for data, the stack may + never report a problem, and even when it does, it can take up to 20 minutes + for it to detect an issue. The curl option --keepalive-time enables + keep-alive support in the TCP/IP stack which makes it periodically probe the + connection to make sure it is still available to send data. That should + reliably detect any TCP/IP network failure. + + But even that won't detect the network going down before the TCP/IP + connection is established (e.g. during a DNS lookup) or using protocols that + don't use TCP. To handle those situations, curl offers a number of timeouts + on its own. --speed-limit/--speed-time will abort if the data transfer rate + falls too low, and --connect-timeout and --max-time can be used to put an + overall timeout on the connection phase or the entire transfer. + + A libcurl-using application running in a known physical environment (e.g. + an embedded device with only a single network connection) may want to act + immediately if its lone network connection goes down. That can be achieved + by having the application monitor the network connection on its own using an + OS-specific mechanism, then signaling libcurl to abort (see also item 5.13). + + 4.20 curl doesn't return error for HTTP non-200 responses! + + Correct. Unless you use -f (--fail). + + When doing HTTP transfers, curl will perform exactly what you're asking it + to do and if successful it will not return an error. You can use curl to + test your web server's "file not found" page (that gets 404 back), you can + use it to check your authentication protected web pages (that gets a 401 + back) and so on. + + The specific HTTP response code does not constitute a problem or error for + curl. It simply sends and delivers HTTP as you asked and if that worked, + everything is fine and dandy. The response code is generally providing more + higher level error information that curl doesn't care about. The error was + not in the HTTP transfer. + + If you want your command line to treat error codes in the 400 and up range + as errors and thus return a non-zero value and possibly show an error + message, curl has a dedicated option for that: -f (CURLOPT_FAILONERROR in + libcurl speak). + + You can also use the -w option and the variable %{response_code} to extract + the exact response code that was returned in the response. + + 4.21 Why is there a HTTP/1.1 in my HTTP/2 request? + + If you use verbose to see the HTTP request when you send off a HTTP/2 + request, it will still say 1.1. + + The reason for this is that we first generate the request to send using the + old 1.1 style and show that request in the verbose output, and then we + convert it over to the binary header-compressed HTTP/2 style. The actual + "1.1" part from that request is then not actually used in the transfer. + The binary HTTP/2 headers are not human readable. + +5. libcurl Issues + + 5.1 Is libcurl thread-safe? + + Yes. + + We have written the libcurl code specifically adjusted for multi-threaded + programs. libcurl will use thread-safe functions instead of non-safe ones if + your system has such. Note that you must never share the same handle in + multiple threads. + + There may be some exceptions to thread safety depending on how libcurl was + built. Please review the guidelines for thread safety to learn more: + https://curl.haxx.se/libcurl/c/threadsafe.html + + 5.2 How can I receive all data into a large memory chunk? + + [ See also the examples/getinmemory.c source ] + + You are in full control of the callback function that gets called every time + there is data received from the remote server. You can make that callback do + whatever you want. You do not have to write the received data to a file. + + One solution to this problem could be to have a pointer to a struct that you + pass to the callback function. You set the pointer using the + CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback + instead of a FILE * to a file: + + /* imaginary struct */ + struct MemoryStruct { + char *memory; + size_t size; + }; + + /* imaginary callback function */ + size_t + WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) + { + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; + } + + 5.3 How do I fetch multiple files with libcurl? + + libcurl has excellent support for transferring multiple files. You should + just repeatedly set new URLs with curl_easy_setopt() and then transfer it + with curl_easy_perform(). The handle you get from curl_easy_init() is not + only reusable, but you're even encouraged to reuse it if you can, as that + will enable libcurl to use persistent connections. + + 5.4 Does libcurl do Winsock initialization on win32 systems? + + Yes, if told to in the curl_global_init() call. + + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + + Yes, but you cannot open a FILE * and pass the pointer to a DLL and have + that DLL use the FILE * (as the DLL and the client application cannot access + each others' variable memory areas). If you set CURLOPT_WRITEDATA you must + also use CURLOPT_WRITEFUNCTION as well to set a function that writes the + file, even if that simply writes the data to the specified FILE *. + Similarly, if you use CURLOPT_READDATA you must also specify + CURLOPT_READFUNCTION. + + 5.6 What about Keep-Alive or persistent connections? + + curl and libcurl have excellent support for persistent connections when + transferring several files from the same server. Curl will attempt to reuse + connections for all URLs specified on the same command line/config file, and + libcurl will reuse connections for all transfers that are made using the + same libcurl handle. + + When you use the easy interface the connection cache is kept within the easy + handle. If you instead use the multi interface, the connection cache will be + kept within the multi handle and will be shared among all the easy handles + that are used within the same multi handle. + + 5.7 Link errors when building libcurl on Windows! + + You need to make sure that your project, and all the libraries (both static + and dynamic) that it links against, are compiled/linked against the same run + time library. + + This is determined by the /MD, /ML, /MT (and their corresponding /M?d) + options to the command line compiler. /MD (linking against MSVCRT dll) seems + to be the most commonly used option. + + When building an application that uses the static libcurl library, you must + add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for + dynamic import symbols. If you're using Visual Studio, you need to instead + add CURL_STATICLIB in the "Preprocessor Definitions" section. + + If you get linker error like "unknown symbol __imp__curl_easy_init ..." you + have linked against the wrong (static) library. If you want to use the + libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of + the import libraries below. These are the libraries produced by the various + lib/Makefile.* files: + + Target: static lib. import lib for libcurl*.dll. + ----------------------------------------------------------- + MingW: libcurl.a libcurldll.a + MSVC (release): libcurl.lib libcurl_imp.lib + MSVC (debug): libcurld.lib libcurld_imp.lib + Borland: libcurl.lib libcurl_imp.lib + + 5.8 libcurl.so.X: open failed: No such file or directory + + This is an error message you might get when you try to run a program linked + with a shared version of libcurl and your run-time linker (ld.so) couldn't + find the shared library named libcurl.so.X. (Where X is the number of the + current libcurl ABI, typically 3 or 4). + + You need to make sure that ld.so finds libcurl.so.X. You can do that + multiple ways, and it differs somewhat between different operating systems, + but they are usually: + + * Add an option to the linker command line that specify the hard-coded path + the run-time linker should check for the lib (usually -R) + + * Set an environment variable (LD_LIBRARY_PATH for example) where ld.so + should check for libs + + * Adjust the system's config to check for libs in the directory where you've + put the dir (like Linux's /etc/ld.so.conf) + + 'man ld.so' and 'man ld' will tell you more details + + 5.9 How does libcurl resolve host names? + + libcurl supports a large a number of different name resolve functions. One + of them is picked at build-time and will be used unconditionally. Thus, if + you want to change name resolver function you must rebuild libcurl and tell + it to use a different function. + + - The non-IPv6 resolver that can use one of four different host name resolve + calls (depending on what your system supports): + + A - gethostbyname() + B - gethostbyname_r() with 3 arguments + C - gethostbyname_r() with 5 arguments + D - gethostbyname_r() with 6 arguments + + - The IPv6-resolver that uses getaddrinfo() + + - The c-ares based name resolver that uses the c-ares library for resolves. + Using this offers asynchronous name resolves. + + - The threaded resolver (default option on Windows). It uses: + + A - gethostbyname() on plain IPv4 hosts + B - getaddrinfo() on IPv6 enabled hosts + + Also note that libcurl never resolves or reverse-lookups addresses given as + pure numbers, such as 127.0.0.1 or ::1. + + 5.10 How do I prevent libcurl from writing the response to stdout? + + libcurl provides a default built-in write function that writes received data + to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly + set CURLOPT_WRITEDATA to a different FILE * handle. + + 5.11 How do I make libcurl not receive the whole HTTP response? + + You make the write callback (or progress callback) return an error and + libcurl will then abort the transfer. + + 5.12 Can I make libcurl fake or hide my real IP address? + + No. libcurl operates on a higher level. Besides, faking IP address would + imply sending IP packets with a made-up source address, and then you normally + get a problem with receiving the packet sent back as they would then not be + routed to you! + + If you use a proxy to access remote sites, the sites will not see your local + IP address but instead the address of the proxy. + + Also note that on many networks NATs or other IP-munging techniques are used + that makes you see and use a different IP address locally than what the + remote server will see you coming from. You may also consider using + https://www.torproject.org/ . + + 5.13 How do I stop an ongoing transfer? + + With the easy interface you make sure to return the correct error code from + one of the callbacks, but none of them are instant. There is no function you + can call from another thread or similar that will stop it immediately. + Instead, you need to make sure that one of the callbacks you use returns an + appropriate value that will stop the transfer. Suitable callbacks that you + can do this with include the progress callback, the read callback and the + write callback. + + If you're using the multi interface, you can also stop a transfer by + removing the particular easy handle from the multi stack at any moment you + think the transfer is done or when you wish to abort the transfer. + + 5.14 Using C++ non-static functions for callbacks? + + libcurl is a C library, it doesn't know anything about C++ member functions. + + You can overcome this "limitation" with relative ease using a static + member function that is passed a pointer to the class: + + // f is the pointer to your object. + static size_t YourClass::func(void *buffer, size_t sz, size_t n, void *f) + { + // Call non-static member function. + static_cast(f)->nonStaticFunction(); + } + + // This is how you pass pointer to the static function: + curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass::func); + curl_easy_setopt(hcurl, CURLOPT_WRITEDATA, this); + + 5.15 How do I get an FTP directory listing? + + If you end the FTP URL you request with a slash, libcurl will provide you + with a directory listing of that given directory. You can also set + CURLOPT_CUSTOMREQUEST to alter what exact listing command libcurl would use + to list the files. + + The follow-up question tends to be how is a program supposed to parse the + directory listing. How does it know what's a file and what's a dir and what's + a symlink etc. If the FTP server supports the MLSD command then it will + return data in a machine-readable format that can be parsed for type. The + types are specified by RFC3659 section 7.5.1. If MLSD is not supported then + you have to work with what you're given. The LIST output format is entirely + at the server's own liking and the NLST output doesn't reveal any types and + in many cases doesn't even include all the directory entries. Also, both LIST + and NLST tend to hide unix-style hidden files (those that start with a dot) + by default so you need to do "LIST -a" or similar to see them. + + Example - List only directories. + ftp.funet.fi supports MLSD and ftp.kernel.org does not: + + curl -s ftp.funet.fi/pub/ -X MLSD | \ + perl -lne 'print if s/(?:^|;)type=dir;[^ ]+ (.+)$/$1/' + + curl -s ftp.kernel.org/pub/linux/kernel/ | \ + perl -lne 'print if s/^d[-rwx]{9}(?: +[^ ]+){7} (.+)$/$1/' + + If you need to parse LIST output in libcurl one such existing + list parser is available at https://cr.yp.to/ftpparse.html Versions of + libcurl since 7.21.0 also provide the ability to specify a wildcard to + download multiple files from one FTP directory. + + 5.16 I want a different time-out! + + Time and time again users realize that CURLOPT_TIMEOUT and + CURLOPT_CONNECTIMEOUT are not sufficiently advanced or flexible to cover all + the various use cases and scenarios applications end up with. + + libcurl offers many more ways to time-out operations. A common alternative + is to use the CURLOPT_LOW_SPEED_LIMIT and CURLOPT_LOW_SPEED_TIME options to + specify the lowest possible speed to accept before to consider the transfer + timed out. + + The most flexible way is by writing your own time-out logic and using + CURLOPT_XFERINFOFUNCTION (perhaps in combination with other callbacks) and + use that to figure out exactly when the right condition is met when the + transfer should get stopped. + + 5.17 Can I write a server with libcurl? + + No. libcurl offers no functions or building blocks to build any kind of + internet protocol server. libcurl is only a client-side library. For server + libraries, you need to continue your search elsewhere but there exist many + good open source ones out there for most protocols you could possibly want a + server for. And there are really good stand-alone ones that have been tested + and proven for many years. There's no need for you to reinvent them! + + 5.18 Does libcurl use threads? + + Put simply: no, libcurl will execute in the same thread you call it in. All + callbacks will be called in the same thread as the one you call libcurl in. + + If you want to avoid your thread to be blocked by the libcurl call, you make + sure you use the non-blocking API which will do transfers asynchronously - + but still in the same single thread. + + libcurl will potentially internally use threads for name resolving, if it + was built to work like that, but in those cases it'll create the child + threads by itself and they will only be used and then killed internally by + libcurl and never exposed to the outside. + +6. License Issues + + Curl and libcurl are released under a MIT/X derivate license. The license is + very liberal and should not impose a problem for your project. This section + is just a brief summary for the cases we get the most questions. (Parts of + this section was much enhanced by Bjorn Reese.) + + We are not lawyers and this is not legal advice. You should probably consult + one if you want true and accurate legal insights without our prejudice. Note + especially that this section concerns the libcurl license only; compiling in + features of libcurl that depend on other libraries (e.g. OpenSSL) may affect + the licensing obligations of your application. + + 6.1 I have a GPL program, can I use the libcurl library? + + Yes! + + Since libcurl may be distributed under the MIT/X derivate license, it can be + used together with GPL in any software. + + 6.2 I have a closed-source program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.3 I have a BSD licensed program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + + Yes! + + The LGPL license doesn't clash with other licenses. + + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + + Yes! + + The MIT/X derivate license practically allows you to do almost anything with + the sources, on the condition that the copyright texts in the sources are + left intact. + + 6.6 Can you please change the curl/libcurl license to XXXX? + + No. + + We have carefully picked this license after years of development and + discussions and a large amount of people have contributed with source code + knowing that this is the license we use. This license puts the restrictions + we want on curl/libcurl and it does not spread to other programs or + libraries that use it. It should be possible for everyone to use libcurl or + curl in their projects, no matter what license they already have in use. + + 6.7 What are my obligations when using libcurl in my commercial apps? + + Next to none. All you need to adhere to is the MIT-style license (stated in + the COPYING file) which basically says you have to include the copyright + notice in "all copies" and that you may not use the copyright holder's name + when promoting your software. + + You do not have to release any of your source code. + + You do not have to reveal or make public any changes to the libcurl source + code. + + You do not have to broadcast to the world that you are using libcurl within + your app. + + All we ask is that you disclose "the copyright notice and this permission + notice" somewhere. Most probably like in the documentation or in the section + where other third party dependencies already are mentioned and acknowledged. + + As can be seen here: https://curl.haxx.se/docs/companies.html and elsewhere, + more and more companies are discovering the power of libcurl and take + advantage of it even in commercial environments. + + +7. PHP/CURL Issues + + 7.1 What is PHP/CURL? + + The module for PHP that makes it possible for PHP programs to access curl- + functions from within PHP. + + In the cURL project we call this module PHP/CURL to differentiate it from + curl the command line tool and libcurl the library. The PHP team however + does not refer to it like this (for unknown reasons). They call it plain + CURL (often using all caps) or sometimes ext/curl, but both cause much + confusion to users which in turn gives us a higher question load. + + 7.2 Who wrote PHP/CURL? + + PHP/CURL was initially written by Sterling Hughes. + + 7.3 Can I perform multiple requests using the same handle? + + Yes - at least in PHP version 4.3.8 and later (this has been known to not + work in earlier versions, but the exact version when it started to work is + unknown to me). + + After a transfer, you just set new options in the handle and make another + transfer. This will make libcurl re-use the same connection if it can. + + 7.4 Does PHP/CURL have dependencies? + + PHP/CURL is a module that comes with the regular PHP package. It depends on + and uses libcurl, so you need to have libcurl installed properly before + PHP/CURL can be used. diff --git a/docs/FEATURES b/docs/FEATURES new file mode 100644 index 0000000000..68d38fc27f --- /dev/null +++ b/docs/FEATURES @@ -0,0 +1,204 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FEATURES + +curl tool + - config file support + - multiple URLs in a single command line + - range "globbing" support: [0-13], {one,two,three} + - multiple file upload on a single command line + - custom maximum transfer rate + - redirectable stderr + - metalink support (*13) + +libcurl + - full URL syntax with no length limit + - custom maximum download time + - custom least download speed acceptable + - custom output result after completion + - guesses protocol from host name unless specified + - uses .netrc + - progress bar with time statistics while downloading + - "standard" proxy environment variables support + - compiles on win32 (reported builds on 40+ operating systems) + - selectable network interface for outgoing traffic + - IPv6 support on unix and Windows + - persistent connections + - socks 4 + 5 support, with or without local name resolving + - supports user name and password in proxy environment variables + - operations through proxy "tunnel" (using CONNECT) + - support for large files (>2GB and >4GB) during upload and download + - replaceable memory functions (malloc, free, realloc, etc) + - asynchronous name resolving (*6) + - both a push and a pull style interface + - international domain names (*11) + +HTTP + - HTTP/1.1 compliant (optionally uses 1.0) + - GET + - PUT + - HEAD + - POST + - Pipelining + - multipart formpost (RFC1867-style) + - authentication: Basic, Digest, NTLM (*9) and Negotiate (SPNEGO) (*3) + to server and proxy + - resume (both GET and PUT) + - follow redirects + - maximum amount of redirects to follow + - custom HTTP request + - cookie get/send fully parsed + - reads/writes the netscape cookie file format + - custom headers (replace/remove internally generated headers) + - custom user-agent string + - custom referrer string + - range + - proxy authentication + - time conditions + - via http-proxy + - retrieve file modification date + - Content-Encoding support for deflate and gzip + - "Transfer-Encoding: chunked" support in uploads + - data compression (*12) + - HTTP/2 (*5) + +HTTPS (*1) + - (all the HTTP features) + - using client certificates + - verify server certificate + - via http-proxy + - select desired encryption + - force usage of a specific SSL version (SSLv2 (*7), SSLv3 (*10) or TLSv1) + +FTP + - download + - authentication + - Kerberos 5 (*14) + - active/passive using PORT, EPRT, PASV or EPSV + - single file size information (compare to HTTP HEAD) + - 'type=' URL support + - dir listing + - dir listing names-only + - upload + - upload append + - upload via http-proxy as HTTP PUT + - download resume + - upload resume + - custom ftp commands (before and/or after the transfer) + - simple "range" support + - via http-proxy + - all operations can be tunneled through a http-proxy + - customizable to retrieve file modification date + - no dir depth limit + +FTPS (*1) + - implicit ftps:// support that use SSL on both connections + - explicit "AUTH TLS" and "AUTH SSL" usage to "upgrade" plain ftp:// + connection to use SSL for both or one of the connections + +SCP (*8) + - both password and public key auth + +SFTP (*8) + - both password and public key auth + - with custom commands sent before/after the transfer + +TFTP + - download + - upload + +TELNET + - connection negotiation + - custom telnet options + - stdin/stdout I/O + +LDAP (*2) + - full LDAP URL support + +DICT + - extended DICT URL support + +FILE + - URL support + - upload + - resume + +SMB + - SMBv1 over TCP and SSL + - download + - upload + - authentication with NTLMv1 + +SMTP + - authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), Kerberos 5 + (*4) and External. + - send e-mails + - mail from support + - mail size support + - mail auth support for trusted server-to-server relaying + - multiple recipients + - via http-proxy + +SMTPS (*1) + - implicit smtps:// support + - explicit "STARTTLS" usage to "upgrade" plain smtp:// connections to use SSL + - via http-proxy + +POP3 + - authentication: Clear Text, APOP and SASL + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), + Kerberos 5 (*4) and External. + - list e-mails + - retrieve e-mails + - enhanced command support for: CAPA, DELE, TOP, STAT, UIDL and NOOP via + custom requests + - via http-proxy + +POP3S (*1) + - implicit pop3s:// support + - explicit "STLS" usage to "upgrade" plain pop3:// connections to use SSL + - via http-proxy + +IMAP + - authentication: Clear Text and SASL + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), + Kerberos 5 (*4) and External. + - list the folders of a mailbox + - select a mailbox with support for verifying the UIDVALIDITY + - fetch e-mails with support for specifying the UID and SECTION + - upload e-mails via the append command + - enhanced command support for: EXAMINE, CREATE, DELETE, RENAME, STATUS, + STORE, COPY and UID via custom requests + - via http-proxy + +IMAPS (*1) + - implicit imaps:// support + - explicit "STARTTLS" usage to "upgrade" plain imap:// connections to use SSL + - via http-proxy + +FOOTNOTES +========= + + *1 = requires a TLS library + *2 = requires OpenLDAP or WinLDAP + *3 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) or + SSPI (native Windows) + *4 = requires a GSS-API implementation, however, only Windows SSPI is + currently supported + *5 = requires nghttp2 and possibly a recent TLS library + *6 = requires c-ares + *7 = requires OpenSSL, NSS, GSKit, WinSSL or Secure Transport; GnuTLS, for + example, only supports SSLv3 and TLSv1 + *8 = requires libssh2 + *9 = requires OpenSSL, GnuTLS, mbedTLS, NSS, yassl, Secure Transport or SSPI + (native Windows) + *10 = requires an SSL library that supports SSLv3 + *11 = requires libidn or Windows + *12 = requires libz + *13 = requires libmetalink, and either an Apple or Microsoft operating + system, or OpenSSL, or GnuTLS, or NSS + *14 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md new file mode 100644 index 0000000000..81747179b9 --- /dev/null +++ b/docs/GOVERNANCE.md @@ -0,0 +1,167 @@ +# Decision making in the curl project + +A rough guide to how we make decisions and who does what. + +## BDFL + +This project was started by and has to some extent been pushed forward over +the years with Daniel Stenberg as the driving force. It matches a standard +BDFL (Benevolent Dictator For Life) style project. + +This setup has been used due to convenience and the fact that is has worked +fine this far. It is not because someone thinks of it as a superior project +leadership model. It will also only continue working as long as Daniel manages +to listen in to what the project and the general user population wants and +expects from us. + +## Legal entity + +There is no legal entity. The curl project is just a bunch of people scattered +around the globe with the common goal to produce source code that creates +great products. We are not part of any umbrella organization and we are not +located in any specific country. We are totally independent. + +The copyrights in the project are owned by the individuals and organizations +that wrote those parts of the code. + +## Decisions + +The curl project is not a democracy, but everyone is entitled to state their +opinion and may argue for their sake within the community. + +All and any changes that have been done or will be done are eligible to bring +up for discussion, to object to or to praise. Ideally, we find consensus for +the appropriate way forward in any given situation or challenge. + +If there is no obvious consensus, a maintainer who's knowledgeable in the +specific area will take an "executive" decision that they think is the right +for the project. + +## Donations + +Donating plain money to curl is best done to curl's [Open Collective +fund](https://opencollective.com/curl). Open Collective is a US based +non-profit organization that holds on to funds for us. This fund is then used +for paying the curl security bug bounties, to reimburse project related +expenses etc. + +Donations to the project can also come in form of server hosting, providing +services and paying for people to work on curl related code etc. Usually, such +donations are services paid for directly by the sponsors. + +We grade sponsors in a few different levels and if they meet the criterias, +they can be mentioned on the Sponsors page on the curl web site. + +## Commercial Support + +The curl project does not do or offer commercial support. It only hosts +mailing lists, runs bug trackers etc to facilitate communication and work. + +However, Daniel works for wolfSSL and we offer commercial curl support there. + +## Key roles + +### Maintainers + +A maintainer in the curl project is an individual who has been given +permissions to push commits to one of the git repositories. + +Maintainers are free to push commits to the repositories at their own will. +Maintainers are however expected to listen to feedback from users and any +change that is non-trivial in size or nature *should* be brought to the +project as a PR to allow others to comment/object before merge. + +### Former maintainers + +A maintainer who stops being active in the project will at some point get +their push permissions removed. We do this for security reasons but also to +make sure that we always have the list of maintainers as "the team that push +stuff to curl". + +Getting push permissions removed is not a punishment. Everyone who ever worked +on maintaining curl is considered a hero, for all time hereafter. + +### Security team members + +We have a security team. That's the team of people who are subscribed to the +curl-security mailing list; the receivers of security reports from users and +developers. This list of people will vary over time but should be skilled +developers familiar with the curl project. + +The security team works best when it consists of a small set of active +persons. We invite new members when the team seems to need it, and we also +expect to retire security team members as they "drift off" from the project or +just find themselves unable to perform their duties there. + +### Server admins + +We run a web server, a mailing list and more on the curl project's primary +server. That physical machine is owned and run by Haxx. Daniel is the primary +admin of all things curl related server stuff, but Björn Stenberg and Linus +Feltzing serve as backup admins for when Daniel is gone or unable. + +The primary server is paid for by Haxx. The machine is physically located in a +server bunker in Stockholm Sweden, operated by the company Portlane. + +The web site contents are served to the web via Fastly and Daniel is the +primary curl contact with Fastly. + +### BDFL + +That's Daniel. + +# Maintainers + +A curl maintainer is a project volunteer who has the authority and rights to +merge changes into a git repository in the curl project. + +Anyone can aspire to become a curl maintainer. + +### Duties + +There are no mandatory duties. We hope and wish that maintainers consider +reviewing patches and help merging them, especially when the changes are +within the area of personal expertise and experience. + +### Requirements + +- only merge code that meets our quality and style guide requirements. +- *never* merge code without doing a PR first, unless the change is "trivial" +- if in doubt, ask for input/feedback from others + +### Recommendations + +- we require two-factor authentication enabled on your github account to + reduce risk of malicious source code tampering +- consider enabling signed git commits for additional verification of changes + +### Merge advice + +When you're merging patches/PRs... + +- make sure the commit messages follow our template +- squash patch sets into a few logical commits even if the PR didn't, if + necessary +- avoid the "merge" button on github, do it "manually" instead to get full + control and full audit trail (github leaves out you as "Committer:") +- remember to credit the reporter and the helpers! + +## Who are maintainers? + +The [list of maintainers](https://github.com/orgs/curl/people). Be aware that +the level of presence and activity in the project vary greatly between +different individuals and over time. + +### Become a maintainer? + +If you think you can help making the project better by shouldering some +maintaining responsibilities, then please get in touch. + +You will be expected to be familiar with the curl project and its ways of +working. You need to have gotten a few quality patches merged as a proof of +this. + +### Stop being a maintainer + +If you (appear to) not be active in the project anymore, you may be removed as +a maintainer. Thank you for your service! diff --git a/docs/HELP-US.md b/docs/HELP-US.md new file mode 100644 index 0000000000..aae2b9f599 --- /dev/null +++ b/docs/HELP-US.md @@ -0,0 +1,70 @@ +# How to get started helping out in the curl project + +We are always in need of more help. If you are new to the project and are +looking for ways to contribute and help out, this document aims to give a few +good starting points. + +A good idea is to start by subscribing to the [curl-library mailing +list](https://cool.haxx.se/mailman/listinfo/curl-library) to keep track of the +current discussion topics. + +## Scratch your own itch + +One of the best ways is to start working on any problems or issues you have +found yourself or perhaps got annoyed at in the past. It can be a spelling +error in an error text or a weirdly phrased section in a man page. Hunt it +down and report the bug. Or make your first pull request with a fix for that. + +## Help wanted + +In the issue tracker we occasionally mark bugs with [help +wanted](https://github.com/curl/curl/labels/help%20wanted), as a sign that the +bug is acknowledged to exist and that there's nobody known to work on this +issue for the moment. Those are bugs that are fine to "grab" and provide a +pull request for. The complexity level of these will of course vary, so pick +one that piques your interest. + +## Work on known bugs + +Some bugs are known and haven't yet received attention and work enough to get +fixed. We collect such known existing flaws in the +[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) page. Many of them link +to the original bug report with some additional details, but some may also +have aged a bit and may require some verification that the bug still exists in +the same way and that what was said about it in the past is still valid. + +## Fix autobuild problems + +On the [autobuilds page](https://curl.haxx.se/dev/builds.html) we show a +collection of test results from the automatic curl build and tests that are +performed by volunteers. Fixing compiler warnings and errors shown there is +something we value greatly. Also, if you own or run systems or architectures +that aren't already tested in the autobuilds, we also appreciate more +volunteers running builds automatically to help us keep curl portable. + +## TODO items + +Ideas for features and functions that we have considered worthwhile to +implement and provide are kept in the +[TODO](https://curl.haxx.se/docs/todo.html) file. Some of the ideas are +rough. Some are well thought out. Some probably aren't really suitable +anymore. + +Before you invest a lot of time on a TODO item, do bring it up for discussion +on the mailing list. For discussion on applicability but also for ideas and +brainstorming on specific ways to do the implementation etc. + +## You decide + +You can also come up with a completely new thing you think we should do. Or +not do. Or fix. Or add to the project. You then either bring it to the mailing +list first to see if people will shoot down the idea at once, or you bring a +first draft of the idea as a pull request and take the discussion there around +the specific implementation. Either way is fine. + +## CONTRIBUTE + +We offer [guidelines](https://curl.haxx.se/dev/contribute.html) that are +suitable to be familiar with before you decide to contribute to curl. If +you're used to open source development, you'll probably not find many +surprises in there. diff --git a/docs/HISTORY.md b/docs/HISTORY.md new file mode 100644 index 0000000000..a628d05098 --- /dev/null +++ b/docs/HISTORY.md @@ -0,0 +1,359 @@ +How curl Became Like This +========================= + +Towards the end of 1996, Daniel Stenberg was spending time writing an IRC bot +for an Amiga related channel on EFnet. He then came up with the idea to make +currency-exchange calculations available to Internet Relay Chat (IRC) +users. All the necessary data were published on the Web; he just needed to +automate their retrieval. + +Daniel simply adopted an existing command-line open-source tool, httpget, that +Brazilian Rafael Sagula had written and recently released version 0.1 of. After +a few minor adjustments, it did just what he needed. + +1997 +---- + +HttpGet 1.0 was released on April 8th 1997 with brand new HTTP proxy support. + +We soon found and fixed support for getting currencies over GOPHER. Once FTP +download support was added, the name of the project was changed and urlget 2.0 +was released in August 1997. The http-only days were already passed. + +1998 +---- + +The project slowly grew bigger. When upload capabilities were added and the +name once again was misleading, a second name change was made and on March 20, +1998 curl 4 was released. (The version numbering from the previous names was +kept.) + +(Unrelated to this project a company called Curl Corporation registered a US +trademark on the name "CURL" on May 18 1998. That company had then already +registered the curl.com domain back in November of the previous year. All this +was revealed to us much later.) + +SSL support was added, powered by the SSLeay library. + +August: first announcement of curl on freshmeat.net. + +October: with the curl 4.9 release and the introduction of cookie support, +curl was no longer released under the GPL license. Now we're at 4000 lines of +code, we switched over to the MPL license to restrict the effects of +"copyleft". + +November: configure script and reported successful compiles on several +major operating systems. The never-quite-understood -F option was added and +curl could now simulate quite a lot of a browser. TELNET support was added. + +Curl 5 was released in December 1998 and introduced the first ever curl man +page. People started making Linux RPM packages out of it. + +1999 +---- + +January: DICT support added. + +OpenSSL took over and SSLeay was abandoned. + +May: first Debian package. + +August: LDAP:// and FILE:// support added. The curl web site gets 1300 visits +weekly. Moved site to curl.haxx.nu. + +September: Released curl 6.0. 15000 lines of code. + +December 28: added the project on Sourceforge and started using its services +for managing the project. + +2000 +---- + +Spring: major internal overhaul to provide a suitable library interface. +The first non-beta release was named 7.1 and arrived in August. This offered +the easy interface and turned out to be the beginning of actually getting +other software and programs to be based on and powered by libcurl. Almost +20000 lines of code. + +June: the curl site moves to "curl.haxx.se" + +August, the curl web site gets 4000 visits weekly. + +The PHP guys adopted libcurl already the same month, when the first ever third +party libcurl binding showed up. CURL has been a supported module in PHP since +the release of PHP 4.0.2. This would soon get followers. More than 16 +different bindings exist at the time of this writing. + +September: kerberos4 support was added. + +November: started the work on a test suite for curl. It was later re-written +from scratch again. The libcurl major SONAME number was set to 1. + +2001 +---- + +January: Daniel released curl 7.5.2 under a new license again: MIT (or +MPL). The MIT license is extremely liberal and can be combined with GPL +in other projects. This would finally put an end to the "complaints" from +people involved in GPLed projects that previously were prohibited from using +libcurl while it was released under MPL only. (Due to the fact that MPL is +deemed "GPL incompatible".) + +March 22: curl supports HTTP 1.1 starting with the release of 7.7. This +also introduced libcurl's ability to do persistent connections. 24000 lines of +code. The libcurl major SONAME number was bumped to 2 due to this overhaul. +The first experimental ftps:// support was added. + +August: curl is bundled in Mac OS X, 10.1. It was already becoming more and +more of a standard utility of Linux distributions and a regular in the BSD +ports collections. The curl web site gets 8000 visits weekly. Curl Corporation +contacted Daniel to discuss "the name issue". After Daniel's reply, they have +never since got back in touch again. + +September: libcurl 7.9 introduces cookie jar and curl_formadd(). During the +forthcoming 7.9.x releases, we introduced the multi interface slowly and +without many whistles. + +2002 +---- + +June: the curl web site gets 13000 visits weekly. curl and libcurl is +35000 lines of code. Reported successful compiles on more than 40 combinations +of CPUs and operating systems. + +To estimate number of users of the curl tool or libcurl library is next to +impossible. Around 5000 downloaded packages each week from the main site gives +a hint, but the packages are mirrored extensively, bundled with numerous OS +distributions and otherwise retrieved as part of other software. + +September: with the release of curl 7.10 it is released under the MIT license +only. + +2003 +---- + +January: Started working on the distributed curl tests. The autobuilds. + +February: the curl site averages at 20000 visits weekly. At any given moment, +there's an average of 3 people browsing the curl.haxx.se site. + +Multiple new authentication schemes are supported: Digest (May), NTLM (June) +and Negotiate (June). + +November: curl 7.10.8 is released. 45000 lines of code. ~55000 unique visitors +to the curl.haxx.se site. Five official web mirrors. + +December: full-fledged SSL for FTP is supported. + +2004 +---- + +January: curl 7.11.0 introduced large file support. + +June: curl 7.12.0 introduced IDN support. 10 official web mirrors. + +This release bumped the major SONAME to 3 due to the removal of the +curl_formparse() function + +August: Curl and libcurl 7.12.1 + + Public curl release number: 82 + Releases counted from the very beginning: 109 + Available command line options: 96 + Available curl_easy_setopt() options: 120 + Number of public functions in libcurl: 36 + Amount of public web site mirrors: 12 + Number of known libcurl bindings: 26 + +2005 +---- + +April: GnuTLS can now optionally be used for the secure layer when curl is +built. + +April: Added the multi_socket() API + +September: TFTP support was added. + +More than 100,000 unique visitors of the curl web site. 25 mirrors. + +December: security vulnerability: libcurl URL Buffer Overflow + +2006 +---- + +January: We dropped support for Gopher. We found bugs in the implementation +that turned out to have been introduced years ago, so with the conclusion that +nobody had found out in all this time we removed it instead of fixing it. + +March: security vulnerability: libcurl TFTP Packet Buffer Overflow + +September: The major SONAME number for libcurl was bumped to 4 due to the +removal of ftp third party transfer support. + +November: Added SCP and SFTP support + +2007 +---- + +February: Added support for the Mozilla NSS library to do the SSL/TLS stuff + +July: security vulnerability: libcurl GnuTLS insufficient cert verification + +2008 +---- + +November: + + Command line options: 128 + curl_easy_setopt() options: 158 + Public functions in libcurl: 58 + Known libcurl bindings: 37 + Contributors: 683 + + 145,000 unique visitors. >100 GB downloaded. + +2009 +---- + +March: security vulnerability: libcurl Arbitrary File Access + +April: added CMake support + +August: security vulnerability: libcurl embedded zero in cert name + +December: Added support for IMAP, POP3 and SMTP + +2010 +---- + +January: Added support for RTSP + +February: security vulnerability: libcurl data callback excessive length + +March: The project switched over to use git (hosted by github) instead of CVS +for source code control + +May: Added support for RTMP + +Added support for PolarSSL to do the SSL/TLS stuff + +August: + + Public curl releases: 117 + Command line options: 138 + curl_easy_setopt() options: 180 + Public functions in libcurl: 58 + Known libcurl bindings: 39 + Contributors: 808 + + Gopher support added (re-added actually, see January 2006) + +2011 +---- + +February: added support for the axTLS backend + +April: added the cyassl backend (later renamed to WolfSSL) + +2012 +---- + + July: Added support for Schannel (native Windows TLS backend) and Darwin SSL + (Native Mac OS X and iOS TLS backend). + + Supports metalink + + October: SSH-agent support. + +2013 +---- + + February: Cleaned up internals to always uses the "multi" non-blocking + approach internally and only expose the blocking API with a wrapper. + + September: First small steps on supporting HTTP/2 with nghttp2. + + October: Removed krb4 support. + + December: Happy eyeballs. + +2014 +---- + + March: first real release supporting HTTP/2 + + September: Web site had 245,000 unique visitors and served 236GB data + + SMB and SMBS support + +2015 +---- + + June: support for multiplexing with HTTP/2 + + August: support for HTTP/2 server push + + December: Public Suffix List + +2016 +---- + + January: the curl tool defaults to HTTP/2 for HTTPS URLs + + December: curl 7.52.0 introduced support for HTTPS-proxy! + + First TLS 1.3 support + +2017 +---- + + July: OSS-Fuzz started fuzzing libcurl + + September: Added Multi-SSL support + + The web site serves 3100 GB/month + + Public curl releases: 169 + Command line options: 211 + curl_easy_setopt() options: 249 + Public functions in libcurl: 74 + Contributors: 1609 + + October: SSLKEYLOGFILE support, new MIME API + + November: brotli + +2018 +---- + + January: new SSH backend powered by libssh + + March: starting with the 1803 release of Windows 10, curl is shipped bundled + with Microsoft's operating system. + + July: curl shows headers using bold type face + + October: added DNS-over-HTTPS (DoH) and the URL API + + MesaLink is a new supported TLS backend + + libcurl now does HTTP/2 (and multiplexing) by default on HTTPS URLs + + curl and libcurl are installed in an estimated 5 *billion* instances + world-wide. + + October 31: Curl and libcurl 7.62.0 + + Public curl releases: 177 + Command line options: 219 + curl_easy_setopt() options: 261 + Public functions in libcurl: 80 + Contributors: 1808 + +2019 +---- + + August: the first HTTP/3 requests with curl. + + September: 7.66.0 is released and the tool offers parallel downloads diff --git a/docs/HTTP-COOKIES.md b/docs/HTTP-COOKIES.md new file mode 100644 index 0000000000..31af9f6d9b --- /dev/null +++ b/docs/HTTP-COOKIES.md @@ -0,0 +1,134 @@ +# HTTP Cookies + +## Cookie overview + + Cookies are `name=contents` pairs that a HTTP server tells the client to + hold and then the client sends back those to the server on subsequent + requests to the same domains and paths for which the cookies were set. + + Cookies are either "session cookies" which typically are forgotten when the + session is over which is often translated to equal when browser quits, or + the cookies aren't session cookies they have expiration dates after which + the client will throw them away. + + Cookies are set to the client with the Set-Cookie: header and are sent to + servers with the Cookie: header. + + For a very long time, the only spec explaining how to use cookies was the + original [Netscape spec from 1994](https://curl.haxx.se/rfc/cookie_spec.html). + + In 2011, [RFC6265](https://www.ietf.org/rfc/rfc6265.txt) was finally + published and details how cookies work within HTTP. In 2016, an update which + added support for prefixes was + [proposed](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00), + and in 2017, another update was + [drafted](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01) + to deprecate modification of 'secure' cookies from non-secure origins. Both + of these drafts have been incorporated into a proposal to + [replace](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02) + RFC6265. Cookie prefixes and secure cookie modification protection has been + implemented by curl. + +## Cookies saved to disk + + Netscape once created a file format for storing cookies on disk so that they + would survive browser restarts. curl adopted that file format to allow + sharing the cookies with browsers, only to see browsers move away from that + format. Modern browsers no longer use it, while curl still does. + + The netscape cookie file format stores one cookie per physical line in the + file with a bunch of associated meta data, each field separated with + TAB. That file is called the cookiejar in curl terminology. + + When libcurl saves a cookiejar, it creates a file header of its own in which + there is a URL mention that will link to the web version of this document. + +## Cookie file format + + The cookie file format is text based and stores one cookie per line. Lines + that start with `#` are treated as comments. + + Each line that each specifies a single cookie consists of seven text fields + separated with TAB characters. A valid line must end with a newline + character. + +### Fields in the file + + Field number, what type and example data and the meaning of it: + + 0. string `example.com` - the domain name + 1. boolean `FALSE` - include subdomains + 2. string `/foobar/` - path + 3. boolean `TRUE` - send/receive over HTTPS only + 4. number `1462299217` - expires at - seconds since Jan 1st 1970, or 0 + 5. string `person` - name of the cookie + 6. string `daniel` - value of the cookie + +## Cookies with curl the command line tool + + curl has a full cookie "engine" built in. If you just activate it, you can + have curl receive and send cookies exactly as mandated in the specs. + + Command line options: + + `-b, --cookie` + + tell curl a file to read cookies from and start the cookie engine, or if it + isn't a file it will pass on the given string. -b name=var works and so does + -b cookiefile. + + `-j, --junk-session-cookies` + + when used in combination with -b, it will skip all "session cookies" on load + so as to appear to start a new cookie session. + + `-c, --cookie-jar` + + tell curl to start the cookie engine and write cookies to the given file + after the request(s) + +## Cookies with libcurl + + libcurl offers several ways to enable and interface the cookie engine. These + options are the ones provided by the native API. libcurl bindings may offer + access to them using other means. + + `CURLOPT_COOKIE` + + Is used when you want to specify the exact contents of a cookie header to + send to the server. + + `CURLOPT_COOKIEFILE` + + Tell libcurl to activate the cookie engine, and to read the initial set of + cookies from the given file. Read-only. + + `CURLOPT_COOKIEJAR` + + Tell libcurl to activate the cookie engine, and when the easy handle is + closed save all known cookies to the given cookiejar file. Write-only. + + `CURLOPT_COOKIELIST` + + Provide detailed information about a single cookie to add to the internal + storage of cookies. Pass in the cookie as a HTTP header with all the details + set, or pass in a line from a netscape cookie file. This option can also be + used to flush the cookies etc. + + `CURLINFO_COOKIELIST` + + Extract cookie information from the internal cookie storage as a linked + list. + +## Cookies with javascript + + These days a lot of the web is built up by javascript. The webbrowser loads + complete programs that render the page you see. These javascript programs + can also set and access cookies. + + Since curl and libcurl are plain HTTP clients without any knowledge of or + capability to handle javascript, such cookies will not be detected or used. + + Often, if you want to mimic what a browser does on such web sites, you can + record web browser HTTP traffic when using such a site and then repeat the + cookie operations using curl or libcurl. diff --git a/docs/HTTP2.md b/docs/HTTP2.md new file mode 100644 index 0000000000..5b4435f888 --- /dev/null +++ b/docs/HTTP2.md @@ -0,0 +1,127 @@ +HTTP/2 with curl +================ + +[HTTP/2 Spec](https://www.rfc-editor.org/rfc/rfc7540.txt) +[http2 explained](https://daniel.haxx.se/http2/) + +Build prerequisites +------------------- + - nghttp2 + - OpenSSL, libressl, BoringSSL, NSS, GnutTLS, mbedTLS, wolfSSL or Schannel + with a new enough version. + +[nghttp2](https://nghttp2.org/) +------------------------------- + +libcurl uses this 3rd party library for the low level protocol handling +parts. The reason for this is that HTTP/2 is much more complex at that layer +than HTTP/1.1 (which we implement on our own) and that nghttp2 is an already +existing and well functional library. + +We require at least version 1.0.0. + +Over an http:// URL +------------------- + +If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will +include an upgrade header in the initial request to the host to allow +upgrading to HTTP/2. + +Possibly we can later introduce an option that will cause libcurl to fail if +not possible to upgrade. Possibly we introduce an option that makes libcurl +use HTTP/2 at once over http:// + +Over an https:// URL +-------------------- + +If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will use +ALPN (or NPN) to negotiate which protocol to continue with. Possibly introduce +an option that will cause libcurl to fail if not possible to use HTTP/2. + +`CURL_HTTP_VERSION_2TLS` was added in 7.47.0 as a way to ask libcurl to prefer +HTTP/2 for HTTPS but stick to 1.1 by default for plain old HTTP connections. + +ALPN is the TLS extension that HTTP/2 is expected to use. The NPN extension is +for a similar purpose, was made prior to ALPN and is used for SPDY so early +HTTP/2 servers are implemented using NPN before ALPN support is widespread. + +`CURLOPT_SSL_ENABLE_ALPN` and `CURLOPT_SSL_ENABLE_NPN` are offered to allow +applications to explicitly disable ALPN or NPN. + +SSL libs +-------- + +The challenge is the ALPN and NPN support and all our different SSL +backends. You may need a fairly updated SSL library version for it to provide +the necessary TLS features. Right now we support: + + - OpenSSL: ALPN and NPN + - libressl: ALPN and NPN + - BoringSSL: ALPN and NPN + - NSS: ALPN and NPN + - GnuTLS: ALPN + - mbedTLS: ALPN + - Schannel: ALPN + - wolfSSL: ALPN + - Secure Transport: ALPN + +Multiplexing +------------ + +Starting in 7.43.0, libcurl fully supports HTTP/2 multiplexing, which is the +term for doing multiple independent transfers over the same physical TCP +connection. + +To take advantage of multiplexing, you need to use the multi interface and set +`CURLMOPT_PIPELINING` to `CURLPIPE_MULTIPLEX`. With that bit set, libcurl will +attempt to re-use existing HTTP/2 connections and just add a new stream over +that when doing subsequent parallel requests. + +While libcurl sets up a connection to a HTTP server there is a period during +which it doesn't know if it can pipeline or do multiplexing and if you add new +transfers in that period, libcurl will default to start new connections for +those transfers. With the new option `CURLOPT_PIPEWAIT` (added in 7.43.0), you +can ask that a transfer should rather wait and see in case there's a +connection for the same host in progress that might end up being possible to +multiplex on. It favours keeping the number of connections low to the cost of +slightly longer time to first byte transferred. + +Applications +------------ + +We hide HTTP/2's binary nature and convert received HTTP/2 traffic to headers +in HTTP 1.1 style. This allows applications to work unmodified. + +curl tool +--------- + +curl offers the `--http2` command line option to enable use of HTTP/2. + +curl offers the `--http2-prior-knowledge` command line option to enable use of +HTTP/2 without HTTP/1.1 Upgrade. + +Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections. + +curl tool limitations +--------------------- + +The command line tool won't do any HTTP/2 multiplexing even though libcurl +supports it, simply because the curl tool is not written to take advantage of +the libcurl API that's necessary for this (the multi interface). We have an +outstanding TODO item for this and **you** can help us make it happen. + +The command line tool also doesn't support HTTP/2 server push for the same +reason it doesn't do multiplexing: it needs to use the multi interface for +that so that multiplexing is supported. + +HTTP Alternative Services +------------------------- + +Alt-Svc is an extension with a corresponding frame (ALTSVC) in HTTP/2 that +tells the client about an alternative "route" to the same content for the same +origin server that you get the response from. A browser or long-living client +can use that hint to create a new connection asynchronously. For libcurl, we +may introduce a way to bring such clues to the application and/or let a +subsequent request use the alternate route automatically. + +[Detailed in RFC 7838](https://tools.ietf.org/html/rfc7838) diff --git a/docs/HTTP3.md b/docs/HTTP3.md new file mode 100644 index 0000000000..55bdd02637 --- /dev/null +++ b/docs/HTTP3.md @@ -0,0 +1,115 @@ +# HTTP3 (and QUIC) + +## Resources + +[HTTP/3 Explained](https://daniel.haxx.se/http3-explained/) - the online free +book describing the protocols involved. + +[QUIC implementation](https://github.com/curl/curl/wiki/QUIC-implementation) - +the wiki page describing the plan for how to support QUIC and HTTP/3 in curl +and libcurl. + +[quicwg.org](https://quicwg.org/) - home of the official protocol drafts + +## QUIC libraries + +QUIC libraries we're experimenting with: + +[ngtcp2](https://github.com/ngtcp2/ngtcp2) + +[quiche](https://github.com/cloudflare/quiche) + +## Experimental! + +HTTP/3 and QUIC support in curl is considered **EXPERIMENTAL** until further +notice. It needs to be enabled at build-time. + +Further development and tweaking of the HTTP/3 support in curl will happen in +in the master branch using pull-requests, just like ordinary changes. + +# ngtcp2 version + +## Build + +Build (patched) OpenSSL + + % git clone --depth 1 -b OpenSSL_1_1_1d-quic-draft-27 https://github.com/tatsuhiro-t/openssl + % cd openssl + % ./config enable-tls1_3 --prefix= + % make + % make install_sw + +Build nghttp3 + + % cd .. + % git clone https://github.com/ngtcp2/nghttp3 + % cd nghttp3 + % autoreconf -i + % ./configure --prefix= --enable-lib-only + % make + % make install + +Build ngtcp2 + + % cd .. + % git clone https://github.com/ngtcp2/ngtcp2 + % cd ngtcp2 + % autoreconf -i + % ./configure PKG_CONFIG_PATH=/lib/pkgconfig:/lib/pkgconfig LDFLAGS="-Wl,-rpath,/lib" --prefix= + % make + % make install + +Build curl + + % cd .. + % git clone https://github.com/curl/curl + % cd curl + % ./buildconf + % LDFLAGS="-Wl,-rpath,/lib" ./configure --with-ssl= --with-nghttp3= --with-ngtcp2= --enable-alt-svc + % make + +# quiche version + +## build + +Clone quiche and BoringSSL: + + % git clone --recursive https://github.com/cloudflare/quiche + +Build BoringSSL (it needs to be built manually so it can be reused with curl): + + % cd quiche/deps/boringssl + % mkdir build + % cd build + % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on .. + % make + % cd .. + % mkdir -p .openssl/lib + % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib + % ln -s $PWD/include .openssl + +Build quiche: + + % cd ../.. + % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta + +Build curl: + + % cd .. + % git clone https://github.com/curl/curl + % cd curl + % ./buildconf + % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release --enable-alt-svc + % make + +## Run + +Use HTTP/3 directly: + + curl --http3 https://nghttp2.org:8443/ + +Upgrade via Alt-Svc: + + curl --alt-svc altsvc.cache https://quic.aiortc.org/ + +See this [list of public HTTP/3 servers](https://bagder.github.io/HTTP3-test/) diff --git a/docs/INSTALL b/docs/INSTALL new file mode 100644 index 0000000000..ff260b1b14 --- /dev/null +++ b/docs/INSTALL @@ -0,0 +1,9 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + How To Compile + +see INSTALL.md diff --git a/docs/INSTALL.cmake b/docs/INSTALL.cmake new file mode 100644 index 0000000000..03328cbcd9 --- /dev/null +++ b/docs/INSTALL.cmake @@ -0,0 +1,90 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + How To Compile with CMake + +Building with CMake +========================== + This document describes how to compile, build and install curl and libcurl + from source code using the CMake build tool. To build with CMake, you will + of course have to first install CMake. The minimum required version of + CMake is specified in the file CMakeLists.txt found in the top of the curl + source tree. Once the correct version of CMake is installed you can follow + the instructions below for the platform you are building on. + + CMake builds can be configured either from the command line, or from one + of CMake's GUI's. + +Current flaws in the curl CMake build +===================================== + + Missing features in the cmake build: + + - Builds libcurl without large file support + - Does not support all SSL libraries (only OpenSSL, WinSSL, DarwinSSL, and + mbed TLS) + - Doesn't build with SCP and SFTP support (libssh2) (see issue #1155) + - Doesn't allow different resolver backends (no c-ares build support) + - No RTMP support built + - Doesn't allow build curl and libcurl debug enabled + - Doesn't allow a custom CA bundle path + - Doesn't allow you to disable specific protocols from the build + - Doesn't find or use krb4 or GSS + - Rebuilds test files too eagerly, but still can't run the tests + - Doesn't detect the correct strerror_r flavor when cross-compiling (issue #1123) + + +Command Line CMake +================== + A CMake build of curl is similar to the autotools build of curl. It + consists of the following steps after you have unpacked the source. + + 1. Create an out of source build tree parallel to the curl source + tree and change into that directory + + $ mkdir curl-build + $ cd curl-build + + 2. Run CMake from the build tree, giving it the path to the top of + the curl source tree. CMake will pick a compiler for you. If you + want to specify the compile, you can set the CC environment + variable prior to running CMake. + + $ cmake ../curl + $ make + + 3. Install to default location: + + $ make install + + (The test suite does not work with the cmake build) + +ccmake +========= + CMake comes with a curses based interface called ccmake. To run ccmake on + a curl use the instructions for the command line cmake, but substitute + ccmake ../curl for cmake ../curl. This will bring up a curses interface + with instructions on the bottom of the screen. You can press the "c" key + to configure the project, and the "g" key to generate the project. After + the project is generated, you can run make. + +cmake-gui +========= + CMake also comes with a Qt based GUI called cmake-gui. To configure with + cmake-gui, you run cmake-gui and follow these steps: + 1. Fill in the "Where is the source code" combo box with the path to + the curl source tree. + 2. Fill in the "Where to build the binaries" combo box with the path + to the directory for your build tree, ideally this should not be the + same as the source tree, but a parallel directory called curl-build or + something similar. + 3. Once the source and binary directories are specified, press the + "Configure" button. + 4. Select the native build tool that you want to use. + 5. At this point you can change any of the options presented in the + GUI. Once you have selected all the options you want, click the + "Generate" button. + 6. Run the native build tool that you used CMake to generate. diff --git a/docs/INSTALL.md b/docs/INSTALL.md new file mode 100644 index 0000000000..63d41421bf --- /dev/null +++ b/docs/INSTALL.md @@ -0,0 +1,509 @@ +# how to install curl and libcurl + +## Installing Binary Packages + +Lots of people download binary distributions of curl and libcurl. This +document does not describe how to install curl or libcurl using such a binary +package. This document describes how to compile, build and install curl and +libcurl from source code. + +## Building using vcpkg + +You can download and install curl and libcurl using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + vcpkg install curl[tool] + +The curl port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + +## Building from git + +If you get your code off a git repository instead of a release tarball, see +the `GIT-INFO` file in the root directory for specific instructions on how to +proceed. + +# Unix + +A normal Unix installation is made in three or four steps (after you've +unpacked the source archive): + + ./configure + make + make test (optional) + make install + +You probably need to be root when doing the last command. + +Get a full listing of all available configure options by invoking it like: + + ./configure --help + +If you want to install curl in a different file hierarchy than `/usr/local`, +specify that when running configure: + + ./configure --prefix=/path/to/curl/tree + +If you have write permission in that directory, you can do 'make install' +without being root. An example of this would be to make a local install in +your own home directory: + + ./configure --prefix=$HOME + make + make install + +The configure script always tries to find a working SSL library unless +explicitly told not to. If you have OpenSSL installed in the default search +path for your compiler/linker, you don't need to do anything special. If you +have OpenSSL installed in `/usr/local/ssl`, you can run configure like: + + ./configure --with-ssl + +If you have OpenSSL installed somewhere else (for example, `/opt/OpenSSL`) and +you have pkg-config installed, set the pkg-config path first, like this: + + env PKG_CONFIG_PATH=/opt/OpenSSL/lib/pkgconfig ./configure --with-ssl + +Without pkg-config installed, use this: + + ./configure --with-ssl=/opt/OpenSSL + +If you insist on forcing a build without SSL support, even though you may +have OpenSSL installed in your system, you can run configure like this: + + ./configure --without-ssl + +If you have OpenSSL installed, but with the libraries in one place and the +header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS` +environment variables prior to running configure. Something like this should +work: + + CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" ./configure + +If you have shared SSL libs installed in a directory where your run-time +linker doesn't find them (which usually causes configure failures), you can +provide this option to gcc to set a hard-coded path to the run-time linker: + + LDFLAGS=-Wl,-R/usr/local/ssl/lib ./configure --with-ssl + +## More Options + +To force a static library compile, disable the shared library creation by +running configure like: + + ./configure --disable-shared + +To tell the configure script to skip searching for thread-safe functions, add +an option like: + + ./configure --disable-thread + +If you're a curl developer and use gcc, you might want to enable more debug +options with the `--enable-debug` option. + +curl can be built to use a whole range of libraries to provide various useful +services, and configure will try to auto-detect a decent default. But if you +want to alter it, you can select how to deal with each individual library. + +## Select TLS backend + +The default OpenSSL configure check will also detect and use BoringSSL or +libressl. + + - GnuTLS: `--without-ssl --with-gnutls`. + - wolfSSL: `--without-ssl --with-wolfssl` + - NSS: `--without-ssl --with-nss` + - mbedTLS: `--without-ssl --with-mbedtls` + - schannel: `--without-ssl --with-schannel` + - secure transport: `--without-ssl --with-secure-transport` + - MesaLink: `--without-ssl --with-mesalink` + - BearSSL: `--without-ssl --with-bearssl` + +# Windows + +## Building Windows DLLs and C run-time (CRT) linkage issues + + As a general rule, building a DLL with static CRT linkage is highly + discouraged, and intermixing CRTs in the same app is something to avoid at + any cost. + + Reading and comprehending Microsoft Knowledge Base articles KB94248 and + KB140584 is a must for any Windows developer. Especially important is full + understanding if you are not going to follow the advice given above. + + - [How To Use the C Run-Time](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time) + - [Run-Time Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library) + - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries) + +If your app is misbehaving in some strange way, or it is suffering from +memory corruption, before asking for further help, please try first to +rebuild every single library your app uses as well as your app using the +debug multithreaded dynamic C runtime. + + If you get linkage errors read section 5.7 of the FAQ document. + +## MingW32 + +Make sure that MinGW32's bin dir is in the search path, for example: + + set PATH=c:\mingw32\bin;%PATH% + +then run `mingw32-make mingw32` in the root dir. There are other +make targets available to build libcurl with more features, use: + + - `mingw32-make mingw32-zlib` to build with Zlib support; + - `mingw32-make mingw32-ssl-zlib` to build with SSL and Zlib enabled; + - `mingw32-make mingw32-ssh2-ssl-zlib` to build with SSH2, SSL, Zlib; + - `mingw32-make mingw32-ssh2-ssl-sspi-zlib` to build with SSH2, SSL, Zlib + and SSPI support. + +If you have any problems linking libraries or finding header files, be sure +to verify that the provided `Makefile.m32` files use the proper paths, and +adjust as necessary. It is also possible to override these paths with +environment variables, for example: + + set ZLIB_PATH=c:\zlib-1.2.8 + set OPENSSL_PATH=c:\openssl-1.0.2c + set LIBSSH2_PATH=c:\libssh2-1.6.0 + +It is also possible to build with other LDAP SDKs than MS LDAP; currently +it is possible to build with native Win32 OpenLDAP, or with the Novell CLDAP +SDK. If you want to use these you need to set these vars: + + set LDAP_SDK=c:\openldap + set USE_LDAP_OPENLDAP=1 + +or for using the Novell SDK: + + set USE_LDAP_NOVELL=1 + +If you want to enable LDAPS support then set LDAPS=1. + +## Cygwin + +Almost identical to the unix installation. Run the configure script in the +curl source tree root with `sh configure`. Make sure you have the `sh` +executable in `/bin/` or you'll see the configure fail toward the end. + +Run `make` + +## Disabling Specific Protocols in Windows builds + +The configure utility, unfortunately, is not available for the Windows +environment, therefore, you cannot use the various disable-protocol options of +the configure utility on this platform. + +You can use specific defines to disable specific protocols and features. See +[CURL-DISABLE.md](CURL-DISABLE-md) for the full list. + +If you want to set any of these defines you have the following options: + + - Modify `lib/config-win32.h` + - Modify `lib/curl_setup.h` + - Modify `winbuild/Makefile.vc` + - Modify the "Preprocessor Definitions" in the libcurl project + +Note: The pre-processor settings can be found using the Visual Studio IDE +under "Project -> Settings -> C/C++ -> General" in VC6 and "Project -> +Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later +versions. + +## Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds + +In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is +necessary to make definition of preprocessor symbol `USE_LWIPSOCK` visible to +libcurl and curl compilation processes. To set this definition you have the +following alternatives: + + - Modify `lib/config-win32.h` and `src/config-win32.h` + - Modify `winbuild/Makefile.vc` + - Modify the "Preprocessor Definitions" in the libcurl project + +Note: The pre-processor settings can be found using the Visual Studio IDE +under "Project -> Settings -> C/C++ -> General" in VC6 and "Project -> +Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later +versions. + +Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, in +order to use it with your program it is mandatory that your program includes +lwIP header file `` (or another lwIP header that includes this) +before including any libcurl header. Your program does not need the +`USE_LWIPSOCK` preprocessor definition which is for libcurl internals only. + +Compilation has been verified with [lwIP +1.4.0](https://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip) and +[contrib-1.4.0](https://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip). + +This BSD-style lwIP TCP/IP stack support must be considered experimental given +that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl +might yet need some additional adjustment, caveat emptor. + +## Important static libcurl usage note + +When building an application that uses the static libcurl library on Windows, +you must add `-DCURL_STATICLIB` to your `CFLAGS`. Otherwise the linker will +look for dynamic import symbols. + +## Legacy Windows and SSL + +Schannel (from Windows SSPI), is the native SSL library in Windows. However, +Schannel in Windows <= XP is unable to connect to servers that +no longer support the legacy handshakes and algorithms used by those +versions. If you will be using curl in one of those earlier versions of +Windows you should choose another SSL backend such as OpenSSL. + +# Apple iOS and macOS + +On modern Apple operating systems, curl can be built to use Apple's SSL/TLS +implementation, Secure Transport, instead of OpenSSL. To build with Secure +Transport for SSL/TLS, use the configure option `--with-darwinssl`. (It is not +necessary to use the option `--without-ssl`.) This feature requires iOS 5.0 or +later, or OS X 10.5 ("Leopard") or later. + +When Secure Transport is in use, the curl options `--cacert` and `--capath` +and their libcurl equivalents, will be ignored, because Secure Transport uses +the certificates stored in the Keychain to evaluate whether or not to trust +the server. This, of course, includes the root certificates that ship with the +OS. The `--cert` and `--engine` options, and their libcurl equivalents, are +currently unimplemented in curl with Secure Transport. + +For macOS users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul +to the Secure Transport API that, among other things, added support for the +newer TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you +must build curl on Mountain Lion or later, or by using the equivalent SDK. If +you set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier +version of macOS prior to building curl, then curl will use the new Secure +Transport API on Mountain Lion and later, and fall back on the older API when +the same curl binary is executed on older cats. For example, running these +commands in curl's directory in the shell will build the code such that it +will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash): + + export MACOSX_DEPLOYMENT_TARGET="10.6" + ./configure --with-darwinssl + make + +# Android + +When building curl for Android it's recommended to use a Linux environment +since using curl's `configure` script is the easiest way to build curl +for Android. Before you can build curl for Android, you need to install the +Android NDK first. This can be done using the SDK Manager that is part of +Android Studio. Once you have installed the Android NDK, you need to figure out +where it has been installed and then set up some environment variables before +launching `configure`. On macOS, those variables could look like this to compile +for `aarch64` and API level 29: + + export NDK=~/Library/Android/sdk/ndk/20.1.5948944 + export HOST_TAG=darwin-x86_64 + export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG + export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar + export AS=$TOOLCHAIN/bin/aarch64-linux-android-as + export CC=$TOOLCHAIN/bin/aarch64-linux-android29-clang + export CXX=$TOOLCHAIN/bin/aarch64-linux-android29-clang++ + export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld + export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib + export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip + +When building on Linux or targeting other API levels or architectures, you need +to adjust those variables accordingly. After that you can build curl like this: + + ./configure --host aarch64-linux-android --with-pic --disable-shared + +Note that this won't give you SSL/TLS support. If you need SSL/TLS, you have +to build curl against a SSL/TLS layer, e.g. OpenSSL, because it's impossible for +curl to access Android's native SSL/TLS layer. To build curl for Android using +OpenSSL, follow the OpenSSL build instructions and then install `libssl.a` and +`libcrypto.a` to `$TOOLCHAIN/sysroot/usr/lib` and copy `include/openssl` to +`$TOOLCHAIN/sysroot/usr/include`. Now you can build curl for Android using +OpenSSL like this: + + ./configure --host aarch64-linux-android --with-pic --disable-shared --with-ssl="$TOOLCHAIN/sysroot/usr" + +Note, however, that you must target at least Android M (API level 23) or `configure` +won't be able to detect OpenSSL since `stderr` (and the like) weren't defined +before Android M. + +# Cross compile + +Download and unpack the curl package. + +`cd` to the new directory. (e.g. `cd curl-7.12.3`) + +Set environment variables to point to the cross-compile toolchain and call +configure with any options you need. Be sure and specify the `--host` and +`--build` parameters at configuration time. The following script is an +example of cross-compiling for the IBM 405GP PowerPC processor using the +toolchain from MonteVista for Hardhat Linux. + + #! /bin/sh + + export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin + export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" + export AR=ppc_405-ar + export AS=ppc_405-as + export LD=ppc_405-ld + export RANLIB=ppc_405-ranlib + export CC=ppc_405-gcc + export NM=ppc_405-nm + + ./configure --target=powerpc-hardhat-linux + --host=powerpc-hardhat-linux + --build=i586-pc-linux-gnu + --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local + --exec-prefix=/usr/local + +You may also need to provide a parameter like `--with-random=/dev/urandom` to +configure as it cannot detect the presence of a random number generating +device for a target system. The `--prefix` parameter specifies where curl +will be installed. If `configure` completes successfully, do `make` and `make +install` as usual. + +In some cases, you may be able to simplify the above commands to as little as: + + ./configure --host=ARCH-OS + +# REDUCING SIZE + +There are a number of configure options that can be used to reduce the size of +libcurl for embedded applications where binary size is an important factor. +First, be sure to set the `CFLAGS` variable when configuring with any relevant +compiler optimization flags to reduce the size of the binary. For gcc, this +would mean at minimum the -Os option, and potentially the `-march=X`, +`-mdynamic-no-pic` and `-flto` options as well, e.g. + + ./configure CFLAGS='-Os' LDFLAGS='-Wl,-Bsymbolic'... + +Note that newer compilers often produce smaller code than older versions +due to improved optimization. + +Be sure to specify as many `--disable-` and `--without-` flags on the +configure command-line as you can to disable all the libcurl features that you +know your application is not going to need. Besides specifying the +`--disable-PROTOCOL` flags for all the types of URLs your application will not +use, here are some other flags that can reduce the size of the library: + + - `--disable-ares` (disables support for the C-ARES DNS library) + - `--disable-cookies` (disables support for HTTP cookies) + - `--disable-crypto-auth` (disables HTTP cryptographic authentication) + - `--disable-ipv6` (disables support for IPv6) + - `--disable-manual` (disables support for the built-in documentation) + - `--disable-proxy` (disables support for HTTP and SOCKS proxies) + - `--disable-unix-sockets` (disables support for UNIX sockets) + - `--disable-verbose` (eliminates debugging strings and error code strings) + - `--disable-versioned-symbols` (disables support for versioned symbols) + - `--enable-hidden-symbols` (eliminates unneeded symbols in the shared library) + - `--without-libidn` (disables support for the libidn DNS library) + - `--without-librtmp` (disables support for RTMP) + - `--without-ssl` (disables support for SSL/TLS) + - `--without-zlib` (disables support for on-the-fly decompression) + +The GNU compiler and linker have a number of options that can reduce the +size of the libcurl dynamic libraries on some platforms even further. +Specify them by providing appropriate `CFLAGS` and `LDFLAGS` variables on +the configure command-line, e.g. + + CFLAGS="-Os -ffunction-sections -fdata-sections + -fno-unwind-tables -fno-asynchronous-unwind-tables -flto" + LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" + +Be sure also to strip debugging symbols from your binaries after compiling +using 'strip' (or the appropriate variant if cross-compiling). If space is +really tight, you may be able to remove some unneeded sections of the shared +library using the -R option to objcopy (e.g. the .comment section). + +Using these techniques it is possible to create a basic HTTP-only shared +libcurl library for i386 Linux platforms that is only 113 KiB in size, and an +FTP-only library that is 113 KiB in size (as of libcurl version 7.50.3, using +gcc 5.4.0). + +You may find that statically linking libcurl to your application will result +in a lower total size than dynamically linking. + +Note that the curl test harness can detect the use of some, but not all, of +the `--disable` statements suggested above. Use will cause tests relying on +those features to fail. The test harness can be manually forced to skip the +relevant tests by specifying certain key words on the `runtests.pl` command +line. Following is a list of appropriate key words: + + - `--disable-cookies` !cookies + - `--disable-manual` !--manual + - `--disable-proxy` !HTTP\ proxy !proxytunnel !SOCKS4 !SOCKS5 + +# PORTS + +This is a probably incomplete list of known hardware and operating systems +that curl has been compiled for. If you know a system curl compiles and +runs on, that isn't listed, please let us know! + + - Alpha DEC OSF 4 + - Alpha Digital UNIX v3.2 + - Alpha FreeBSD 4.1, 4.5 + - Alpha Linux 2.2, 2.4 + - Alpha NetBSD 1.5.2 + - Alpha OpenBSD 3.0 + - Alpha OpenVMS V7.1-1H2 + - Alpha Tru64 v5.0 5.1 + - AVR32 Linux + - ARM Android 1.5, 2.1, 2.3, 3.2, 4.x + - ARM INTEGRITY + - ARM iOS + - Cell Linux + - Cell Cell OS + - HP-PA HP-UX 9.X 10.X 11.X + - HP-PA Linux + - HP3000 MPE/iX + - MicroBlaze uClinux + - MIPS IRIX 6.2, 6.5 + - MIPS Linux + - OS/400 + - Pocket PC/Win CE 3.0 + - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 + - PowerPC Darwin 1.0 + - PowerPC INTEGRITY + - PowerPC Linux + - PowerPC Mac OS 9 + - PowerPC Mac OS X + - SH4 Linux 2.6.X + - SH4 OS21 + - SINIX-Z v5 + - Sparc Linux + - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 + - Sparc SunOS 4.1.X + - StrongARM (and other ARM) RISC OS 3.1, 4.02 + - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 + - StrongARM NetBSD 1.4.1 + - Symbian OS (P.I.P.S.) 9.x + - TPF + - Ultrix 4.3a + - UNICOS 9.0 + - i386 BeOS + - i386 DOS + - i386 eCos 1.3.1 + - i386 Esix 4.1 + - i386 FreeBSD + - i386 HURD + - i386 Haiku OS + - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 + - i386 Mac OS X + - i386 MINIX 3.1 + - i386 NetBSD + - i386 Novell NetWare + - i386 OS/2 + - i386 OpenBSD + - i386 QNX 6 + - i386 SCO unix + - i386 Solaris 2.7 + - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 + - i486 ncr-sysv4.3.03 (NCR MP-RAS) + - ia64 Linux 2.3.99 + - m68k AmigaOS 3 + - m68k Linux + - m68k uClinux + - m68k OpenBSD + - m88k dg-dgux5.4R3.00 + - s390 Linux + - x86_64 Linux + - XScale/PXA250 Linux 2.4 + - Nios II uClinux diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md new file mode 100644 index 0000000000..add8b417f3 --- /dev/null +++ b/docs/INTERNALS.md @@ -0,0 +1,1099 @@ +curl internals +============== + + - [Intro](#intro) + - [git](#git) + - [Portability](#Portability) + - [Windows vs Unix](#winvsunix) + - [Library](#Library) + - [`Curl_connect`](#Curl_connect) + - [`multi_do`](#multi_do) + - [`Curl_readwrite`](#Curl_readwrite) + - [`multi_done`](#multi_done) + - [`Curl_disconnect`](#Curl_disconnect) + - [HTTP(S)](#http) + - [FTP](#ftp) + - [Kerberos](#kerberos) + - [TELNET](#telnet) + - [FILE](#file) + - [SMB](#smb) + - [LDAP](#ldap) + - [E-mail](#email) + - [General](#general) + - [Persistent Connections](#persistent) + - [multi interface/non-blocking](#multi) + - [SSL libraries](#ssl) + - [Library Symbols](#symbols) + - [Return Codes and Informationals](#returncodes) + - [AP/ABI](#abi) + - [Client](#client) + - [Memory Debugging](#memorydebug) + - [Test Suite](#test) + - [Asynchronous name resolves](#asyncdns) + - [c-ares](#cares) + - [`curl_off_t`](#curl_off_t) + - [curlx](#curlx) + - [Content Encoding](#contentencoding) + - [`hostip.c` explained](#hostip) + - [Track Down Memory Leaks](#memoryleak) + - [`multi_socket`](#multi_socket) + - [Structs in libcurl](#structs) + - [Curl_easy](#Curl_easy) + - [connectdata](#connectdata) + - [Curl_multi](#Curl_multi) + - [Curl_handler](#Curl_handler) + - [conncache](#conncache) + - [Curl_share](#Curl_share) + - [CookieInfo](#CookieInfo) + + +Intro +===== + + This project is split in two. The library and the client. The client part + uses the library, but the library is designed to allow other applications to + use it. + + The largest amount of code and complexity is in the library part. + + + +git +=== + + All changes to the sources are committed to the git repository as soon as + they're somewhat verified to work. Changes shall be committed as independently + as possible so that individual changes can be easily spotted and tracked + afterwards. + + Tagging shall be used extensively, and by the time we release new archives we + should tag the sources with a name similar to the released version number. + + +Portability +=========== + + We write curl and libcurl to compile with C89 compilers. On 32-bit and up + machines. Most of libcurl assumes more or less POSIX compliance but that's + not a requirement. + + We write libcurl to build and work with lots of third party tools, and we + want it to remain functional and buildable with these and later versions + (older versions may still work but is not what we work hard to maintain): + +Dependencies +------------ + + - OpenSSL 0.9.7 + - GnuTLS 2.11.3 + - zlib 1.1.4 + - libssh2 0.16 + - c-ares 1.6.0 + - libidn2 2.0.0 + - wolfSSL 2.0.0 + - openldap 2.0 + - MIT Kerberos 1.2.4 + - GSKit V5R3M0 + - NSS 3.14.x + - Heimdal ? + - nghttp2 1.12.0 + +Operating Systems +----------------- + + On systems where configure runs, we aim at working on them all - if they have + a suitable C compiler. On systems that don't run configure, we strive to keep + curl running correctly on: + + - Windows 98 + - AS/400 V5R3M0 + - Symbian 9.1 + - Windows CE ? + - TPF ? + +Build tools +----------- + + When writing code (mostly for generating stuff included in release tarballs) + we use a few "build tools" and we make sure that we remain functional with + these versions: + + - GNU Libtool 1.4.2 + - GNU Autoconf 2.57 + - GNU Automake 1.7 + - GNU M4 1.4 + - perl 5.004 + - roffit 0.5 + - groff ? (any version that supports `groff -Tps -man [in] [out]`) + - ps2pdf (gs) ? + + +Windows vs Unix +=============== + + There are a few differences in how to program curl the Unix way compared to + the Windows way. Perhaps the four most notable details are: + + 1. Different function names for socket operations. + + In curl, this is solved with defines and macros, so that the source looks + the same in all places except for the header file that defines them. The + macros in use are `sclose()`, `sread()` and `swrite()`. + + 2. Windows requires a couple of init calls for the socket stuff. + + That's taken care of by the `curl_global_init()` call, but if other libs + also do it etc there might be reasons for applications to alter that + behaviour. + + 3. The file descriptors for network communication and file operations are + not as easily interchangeable as in Unix. + + We avoid this by not trying any funny tricks on file descriptors. + + 4. When writing data to stdout, Windows makes end-of-lines the DOS way, thus + destroying binary data, although you do want that conversion if it is + text coming through... (sigh) + + We set stdout to binary under windows + + Inside the source code, We make an effort to avoid `#ifdef [Your OS]`. All + conditionals that deal with features *should* instead be in the format + `#ifdef HAVE_THAT_WEIRD_FUNCTION`. Since Windows can't run configure scripts, + we maintain a `curl_config-win32.h` file in lib directory that is supposed to + look exactly like a `curl_config.h` file would have looked like on a Windows + machine! + + Generally speaking: always remember that this will be compiled on dozens of + operating systems. Don't walk on the edge! + + +Library +======= + + (See [Structs in libcurl](#structs) for the separate section describing all + major internal structs and their purposes.) + + There are plenty of entry points to the library, namely each publicly defined + function that libcurl offers to applications. All of those functions are + rather small and easy-to-follow. All the ones prefixed with `curl_easy` are + put in the `lib/easy.c` file. + + `curl_global_init()` and `curl_global_cleanup()` should be called by the + application to initialize and clean up global stuff in the library. As of + today, it can handle the global SSL initing if SSL is enabled and it can init + the socket layer on windows machines. libcurl itself has no "global" scope. + + All printf()-style functions use the supplied clones in `lib/mprintf.c`. This + makes sure we stay absolutely platform independent. + + [ `curl_easy_init()`][2] allocates an internal struct and makes some + initializations. The returned handle does not reveal internals. This is the + `Curl_easy` struct which works as an "anchor" struct for all `curl_easy` + functions. All connections performed will get connect-specific data allocated + that should be used for things related to particular connections/requests. + + [`curl_easy_setopt()`][1] takes three arguments, where the option stuff must + be passed in pairs: the parameter-ID and the parameter-value. The list of + options is documented in the man page. This function mainly sets things in + the `Curl_easy` struct. + + `curl_easy_perform()` is just a wrapper function that makes use of the multi + API. It basically calls `curl_multi_init()`, `curl_multi_add_handle()`, + `curl_multi_wait()`, and `curl_multi_perform()` until the transfer is done + and then returns. + + Some of the most important key functions in `url.c` are called from + `multi.c` when certain key steps are to be made in the transfer operation. + + +Curl_connect() +-------------- + + Analyzes the URL, it separates the different components and connects to the + remote host. This may involve using a proxy and/or using SSL. The + `Curl_resolv()` function in `lib/hostip.c` is used for looking up host + names (it does then use the proper underlying method, which may vary + between platforms and builds). + + When `Curl_connect` is done, we are connected to the remote site. Then it + is time to tell the server to get a document/file. `Curl_do()` arranges + this. + + This function makes sure there's an allocated and initiated `connectdata` + struct that is used for this particular connection only (although there may + be several requests performed on the same connect). A bunch of things are + inited/inherited from the `Curl_easy` struct. + + +multi_do() +--------- + + `multi_do()` makes sure the proper protocol-specific function is called. + The functions are named after the protocols they handle. + + The protocol-specific functions of course deal with protocol-specific + negotiations and setup. They have access to the `Curl_sendf()` (from + `lib/sendf.c`) function to send printf-style formatted data to the remote + host and when they're ready to make the actual file transfer they call the + `Curl_setup_transfer()` function (in `lib/transfer.c`) to setup the + transfer and returns. + + If this DO function fails and the connection is being re-used, libcurl will + then close this connection, setup a new connection and re-issue the DO + request on that. This is because there is no way to be perfectly sure that + we have discovered a dead connection before the DO function and thus we + might wrongly be re-using a connection that was closed by the remote peer. + + +Curl_readwrite() +---------------- + + Called during the transfer of the actual protocol payload. + + During transfer, the progress functions in `lib/progress.c` are called at + frequent intervals (or at the user's choice, a specified callback might get + called). The speedcheck functions in `lib/speedcheck.c` are also used to + verify that the transfer is as fast as required. + + +multi_done() +----------- + + Called after a transfer is done. This function takes care of everything + that has to be done after a transfer. This function attempts to leave + matters in a state so that `multi_do()` should be possible to call again on + the same connection (in a persistent connection case). It might also soon + be closed with `Curl_disconnect()`. + + +Curl_disconnect() +----------------- + + When doing normal connections and transfers, no one ever tries to close any + connections so this is not normally called when `curl_easy_perform()` is + used. This function is only used when we are certain that no more transfers + are going to be made on the connection. It can be also closed by force, or + it can be called to make sure that libcurl doesn't keep too many + connections alive at the same time. + + This function cleans up all resources that are associated with a single + connection. + + +HTTP(S) +======= + + HTTP offers a lot and is the protocol in curl that uses the most lines of + code. There is a special file `lib/formdata.c` that offers all the + multipart post functions. + + base64-functions for user+password stuff (and more) is in `lib/base64.c` + and all functions for parsing and sending cookies are found in + `lib/cookie.c`. + + HTTPS uses in almost every case the same procedure as HTTP, with only two + exceptions: the connect procedure is different and the function used to read + or write from the socket is different, although the latter fact is hidden in + the source by the use of `Curl_read()` for reading and `Curl_write()` for + writing data to the remote server. + + `http_chunks.c` contains functions that understands HTTP 1.1 chunked transfer + encoding. + + An interesting detail with the HTTP(S) request, is the `Curl_add_buffer()` + series of functions we use. They append data to one single buffer, and when + the building is finished the entire request is sent off in one single write. + This is done this way to overcome problems with flawed firewalls and lame + servers. + + +FTP +=== + + The `Curl_if2ip()` function can be used for getting the IP number of a + specified network interface, and it resides in `lib/if2ip.c`. + + `Curl_ftpsendf()` is used for sending FTP commands to the remote server. It + was made a separate function to prevent us programmers from forgetting that + they must be CRLF terminated. They must also be sent in one single `write()` + to make firewalls and similar happy. + + +Kerberos +======== + + Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also + `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and + `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics. + + +TELNET +====== + + Telnet is implemented in `lib/telnet.c`. + + +FILE +==== + + The `file://` protocol is dealt with in `lib/file.c`. + + +SMB +=== + + The `smb://` protocol is dealt with in `lib/smb.c`. + + +LDAP +==== + + Everything LDAP is in `lib/ldap.c` and `lib/openldap.c`. + + +E-mail +====== + + The e-mail related source code is in `lib/imap.c`, `lib/pop3.c` and + `lib/smtp.c`. + + +General +======= + + URL encoding and decoding, called escaping and unescaping in the source code, + is found in `lib/escape.c`. + + While transferring data in `Transfer()` a few functions might get used. + `curl_getdate()` in `lib/parsedate.c` is for HTTP date comparisons (and + more). + + `lib/getenv.c` offers `curl_getenv()` which is for reading environment + variables in a neat platform independent way. That's used in the client, but + also in `lib/url.c` when checking the proxy environment variables. Note that + contrary to the normal unix `getenv()`, this returns an allocated buffer that + must be `free()`ed after use. + + `lib/netrc.c` holds the `.netrc` parser. + + `lib/timeval.c` features replacement functions for systems that don't have + `gettimeofday()` and a few support functions for timeval conversions. + + A function named `curl_version()` that returns the full curl version string + is found in `lib/version.c`. + + +Persistent Connections +====================== + + The persistent connection support in libcurl requires some considerations on + how to do things inside of the library. + + - The `Curl_easy` struct returned in the [`curl_easy_init()`][2] call + must never hold connection-oriented data. It is meant to hold the root data + as well as all the options etc that the library-user may choose. + + - The `Curl_easy` struct holds the "connection cache" (an array of + pointers to `connectdata` structs). + + - This enables the 'curl handle' to be reused on subsequent transfers. + + - When libcurl is told to perform a transfer, it first checks for an already + existing connection in the cache that we can use. Otherwise it creates a + new one and adds that to the cache. If the cache is full already when a new + connection is added, it will first close the oldest unused one. + + - When the transfer operation is complete, the connection is left + open. Particular options may tell libcurl not to, and protocols may signal + closure on connections and then they won't be kept open, of course. + + - When `curl_easy_cleanup()` is called, we close all still opened connections, + unless of course the multi interface "owns" the connections. + + The curl handle must be re-used in order for the persistent connections to + work. + + +multi interface/non-blocking +============================ + + The multi interface is a non-blocking interface to the library. To make that + interface work as well as possible, no low-level functions within libcurl + must be written to work in a blocking manner. (There are still a few spots + violating this rule.) + + One of the primary reasons we introduced c-ares support was to allow the name + resolve phase to be perfectly non-blocking as well. + + The FTP and the SFTP/SCP protocols are examples of how we adapt and adjust + the code to allow non-blocking operations even on multi-stage command- + response protocols. They are built around state machines that return when + they would otherwise block waiting for data. The DICT, LDAP and TELNET + protocols are crappy examples and they are subject for rewrite in the future + to better fit the libcurl protocol family. + + +SSL libraries +============= + + Originally libcurl supported SSLeay for SSL/TLS transports, but that was then + extended to its successor OpenSSL but has since also been extended to several + other SSL/TLS libraries and we expect and hope to further extend the support + in future libcurl versions. + + To deal with this internally in the best way possible, we have a generic SSL + function API as provided by the `vtls/vtls.[ch]` system, and they are the only + SSL functions we must use from within libcurl. vtls is then crafted to use + the appropriate lower-level function calls to whatever SSL library that is in + use. For example `vtls/openssl.[ch]` for the OpenSSL library. + + +Library Symbols +=============== + + All symbols used internally in libcurl must use a `Curl_` prefix if they're + used in more than a single file. Single-file symbols must be made static. + Public ("exported") symbols must use a `curl_` prefix. (There are exceptions, + but they are to be changed to follow this pattern in future versions.) Public + API functions are marked with `CURL_EXTERN` in the public header files so + that all others can be hidden on platforms where this is possible. + + +Return Codes and Informationals +=============================== + + I've made things simple. Almost every function in libcurl returns a CURLcode, + that must be `CURLE_OK` if everything is OK or otherwise a suitable error + code as the `curl/curl.h` include file defines. The very spot that detects an + error must use the `Curl_failf()` function to set the human-readable error + description. + + In aiding the user to understand what's happening and to debug curl usage, we + must supply a fair number of informational messages by using the + `Curl_infof()` function. Those messages are only displayed when the user + explicitly asks for them. They are best used when revealing information that + isn't otherwise obvious. + + +API/ABI +======= + + We make an effort to not export or show internals or how internals work, as + that makes it easier to keep a solid API/ABI over time. See docs/libcurl/ABI + for our promise to users. + + +Client +====== + + `main()` resides in `src/tool_main.c`. + + `src/tool_hugehelp.c` is automatically generated by the `mkhelp.pl` perl + script to display the complete "manual" and the `src/tool_urlglob.c` file + holds the functions used for the URL-"globbing" support. Globbing in the + sense that the `{}` and `[]` expansion stuff is there. + + The client mostly sets up its `config` struct properly, then + it calls the `curl_easy_*()` functions of the library and when it gets back + control after the `curl_easy_perform()` it cleans up the library, checks + status and exits. + + When the operation is done, the `ourWriteOut()` function in `src/writeout.c` + may be called to report about the operation. That function is using the + `curl_easy_getinfo()` function to extract useful information from the curl + session. + + It may loop and do all this several times if many URLs were specified on the + command line or config file. + + +Memory Debugging +================ + + The file `lib/memdebug.c` contains debug-versions of a few functions. + Functions such as `malloc()`, `free()`, `fopen()`, `fclose()`, etc that + somehow deal with resources that might give us problems if we "leak" them. + The functions in the memdebug system do nothing fancy, they do their normal + function and then log information about what they just did. The logged data + can then be analyzed after a complete session, + + `memanalyze.pl` is the perl script present in `tests/` that analyzes a log + file generated by the memory tracking system. It detects if resources are + allocated but never freed and other kinds of errors related to resource + management. + + Internally, definition of preprocessor symbol `DEBUGBUILD` restricts code + which is only compiled for debug enabled builds. And symbol `CURLDEBUG` is + used to differentiate code which is _only_ used for memory + tracking/debugging. + + Use `-DCURLDEBUG` when compiling to enable memory debugging, this is also + switched on by running configure with `--enable-curldebug`. Use + `-DDEBUGBUILD` when compiling to enable a debug build or run configure with + `--enable-debug`. + + `curl --version` will list 'Debug' feature for debug enabled builds, and + will list 'TrackMemory' feature for curl debug memory tracking capable + builds. These features are independent and can be controlled when running + the configure script. When `--enable-debug` is given both features will be + enabled, unless some restriction prevents memory tracking from being used. + + +Test Suite +========== + + The test suite is placed in its own subdirectory directly off the root in the + curl archive tree, and it contains a bunch of scripts and a lot of test case + data. + + The main test script is `runtests.pl` that will invoke test servers like + `httpserver.pl` and `ftpserver.pl` before all the test cases are performed. + The test suite currently only runs on Unix-like platforms. + + You'll find a description of the test suite in the `tests/README` file, and + the test case data files in the `tests/FILEFORMAT` file. + + The test suite automatically detects if curl was built with the memory + debugging enabled, and if it was, it will detect memory leaks, too. + + +Asynchronous name resolves +========================== + + libcurl can be built to do name resolves asynchronously, using either the + normal resolver in a threaded manner or by using c-ares. + + +[c-ares][3] +------ + +### Build libcurl to use a c-ares + +1. ./configure --enable-ares=/path/to/ares/install +2. make + +### c-ares on win32 + + First I compiled c-ares. I changed the default C runtime library to be the + single-threaded rather than the multi-threaded (this seems to be required to + prevent linking errors later on). Then I simply build the areslib project + (the other projects adig/ahost seem to fail under MSVC). + + Next was libcurl. I opened `lib/config-win32.h` and I added a: + `#define USE_ARES 1` + + Next thing I did was I added the path for the ares includes to the include + path, and the libares.lib to the libraries. + + Lastly, I also changed libcurl to be single-threaded rather than + multi-threaded, again this was to prevent some duplicate symbol errors. I'm + not sure why I needed to change everything to single-threaded, but when I + didn't I got redefinition errors for several CRT functions (`malloc()`, + `stricmp()`, etc.) + + +`curl_off_t` +========== + + `curl_off_t` is a data type provided by the external libcurl include + headers. It is the type meant to be used for the [`curl_easy_setopt()`][1] + options that end with LARGE. The type is 64-bit large on most modern + platforms. + + +curlx +===== + + The libcurl source code offers a few functions by source only. They are not + part of the official libcurl API, but the source files might be useful for + others so apps can optionally compile/build with these sources to gain + additional functions. + + We provide them through a single header file for easy access for apps: + `curlx.h` + +`curlx_strtoofft()` +------------------- + A macro that converts a string containing a number to a `curl_off_t` number. + This might use the `curlx_strtoll()` function which is provided as source + code in strtoofft.c. Note that the function is only provided if no + `strtoll()` (or equivalent) function exist on your platform. If `curl_off_t` + is only a 32-bit number on your platform, this macro uses `strtol()`. + +Future +------ + + Several functions will be removed from the public `curl_` name space in a + future libcurl release. They will then only become available as `curlx_` + functions instead. To make the transition easier, we already today provide + these functions with the `curlx_` prefix to allow sources to be built + properly with the new function names. The concerned functions are: + + - `curlx_getenv` + - `curlx_strequal` + - `curlx_strnequal` + - `curlx_mvsnprintf` + - `curlx_msnprintf` + - `curlx_maprintf` + - `curlx_mvaprintf` + - `curlx_msprintf` + - `curlx_mprintf` + - `curlx_mfprintf` + - `curlx_mvsprintf` + - `curlx_mvprintf` + - `curlx_mvfprintf` + + +Content Encoding +================ + +## About content encodings + + [HTTP/1.1][4] specifies that a client may request that a server encode its + response. This is usually used to compress a response using one (or more) + encodings from a set of commonly available compression techniques. These + schemes include `deflate` (the zlib algorithm), `gzip`, `br` (brotli) and + `compress`. A client requests that the server perform an encoding by including + an `Accept-Encoding` header in the request document. The value of the header + should be one of the recognized tokens `deflate`, ... (there's a way to + register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor + the client's encoding request. When a response is encoded, the server + includes a `Content-Encoding` header in the response. The value of the + `Content-Encoding` header indicates which encodings were used to encode the + data, in the order in which they were applied. + + It's also possible for a client to attach priorities to different schemes so + that the server knows which it prefers. See sec 14.3 of RFC 2616 for more + information on the `Accept-Encoding` header. See sec + [3.1.2.2 of RFC 7231][15] for more information on the `Content-Encoding` + header. + +## Supported content encodings + + The `deflate`, `gzip` and `br` content encodings are supported by libcurl. + Both regular and chunked transfers work fine. The zlib library is required + for the `deflate` and `gzip` encodings, while the brotli decoding library is + for the `br` encoding. + +## The libcurl interface + + To cause libcurl to request a content encoding use: + + [`curl_easy_setopt`][1](curl, [`CURLOPT_ACCEPT_ENCODING`][5], string) + + where string is the intended value of the `Accept-Encoding` header. + + Currently, libcurl does support multiple encodings but only + understands how to process responses that use the `deflate`, `gzip` and/or + `br` content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5] + that will work (besides `identity`, which does nothing) are `deflate`, + `gzip` and `br`. If a response is encoded using the `compress` or methods, + libcurl will return an error indicating that the response could + not be decoded. If `` is NULL no `Accept-Encoding` header is + generated. If `` is a zero-length string, then an `Accept-Encoding` + header containing all supported encodings will be generated. + + The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for + content to be automatically decoded. If it is not set and the server still + sends encoded content (despite not having been asked), the data is returned + in its raw form and the `Content-Encoding` type is not checked. + +## The curl interface + + Use the [`--compressed`][6] option with curl to cause it to ask servers to + compress responses using any format supported by curl. + + +`hostip.c` explained +==================== + + The main compile-time defines to keep in mind when reading the `host*.c` + source file are these: + +## `CURLRES_IPV6` + + this host has `getaddrinfo()` and family, and thus we use that. The host may + not be able to resolve IPv6, but we don't really have to take that into + account. Hosts that aren't IPv6-enabled have `CURLRES_IPV4` defined. + +## `CURLRES_ARES` + + is defined if libcurl is built to use c-ares for asynchronous name + resolves. This can be Windows or \*nix. + +## `CURLRES_THREADED` + + is defined if libcurl is built to use threading for asynchronous name + resolves. The name resolve will be done in a new thread, and the supported + asynch API will be the same as for ares-builds. This is the default under + (native) Windows. + + If any of the two previous are defined, `CURLRES_ASYNCH` is defined too. If + libcurl is not built to use an asynchronous resolver, `CURLRES_SYNCH` is + defined. + +## `host*.c` sources + + The `host*.c` sources files are split up like this: + + - `hostip.c` - method-independent resolver functions and utility functions + - `hostasyn.c` - functions for asynchronous name resolves + - `hostsyn.c` - functions for synchronous name resolves + - `asyn-ares.c` - functions for asynchronous name resolves using c-ares + - `asyn-thread.c` - functions for asynchronous name resolves using threads + - `hostip4.c` - IPv4 specific functions + - `hostip6.c` - IPv6 specific functions + + The `hostip.h` is the single united header file for all this. It defines the + `CURLRES_*` defines based on the `config*.h` and `curl_setup.h` defines. + + +Track Down Memory Leaks +======================= + +## Single-threaded + + Please note that this memory leak system is not adjusted to work in more + than one thread. If you want/need to use it in a multi-threaded app. Please + adjust accordingly. + +## Build + + Rebuild libcurl with `-DCURLDEBUG` (usually, rerunning configure with + `--enable-debug` fixes this). `make clean` first, then `make` so that all + files are actually rebuilt properly. It will also make sense to build + libcurl with the debug option (usually `-g` to the compiler) so that + debugging it will be easier if you actually do find a leak in the library. + + This will create a library that has memory debugging enabled. + +## Modify Your Application + + Add a line in your application code: + + `curl_dbg_memdebug("dump");` + + This will make the malloc debug system output a full trace of all resource + using functions to the given file name. Make sure you rebuild your program + and that you link with the same libcurl you built for this purpose as + described above. + +## Run Your Application + + Run your program as usual. Watch the specified memory trace file grow. + + Make your program exit and use the proper libcurl cleanup functions etc. So + that all non-leaks are returned/freed properly. + +## Analyze the Flow + + Use the `tests/memanalyze.pl` perl script to analyze the dump file: + + tests/memanalyze.pl dump + + This now outputs a report on what resources that were allocated but never + freed etc. This report is very fine for posting to the list! + + If this doesn't produce any output, no leak was detected in libcurl. Then + the leak is mostly likely to be in your code. + + +`multi_socket` +============== + + Implementation of the `curl_multi_socket` API + + The main ideas of this API are simply: + + 1. The application can use whatever event system it likes as it gets info + from libcurl about what file descriptors libcurl waits for what action + on. (The previous API returns `fd_sets` which is very + `select()`-centric). + + 2. When the application discovers action on a single socket, it calls + libcurl and informs that there was action on this particular socket and + libcurl can then act on that socket/transfer only and not care about + any other transfers. (The previous API always had to scan through all + the existing transfers.) + + The idea is that [`curl_multi_socket_action()`][7] calls a given callback + with information about what socket to wait for what action on, and the + callback only gets called if the status of that socket has changed. + + We also added a timer callback that makes libcurl call the application when + the timeout value changes, and you set that with [`curl_multi_setopt()`][9] + and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work, + Internally, there's an added struct to each easy handle in which we store + an "expire time" (if any). The structs are then "splay sorted" so that we + can add and remove times from the linked list and yet somewhat swiftly + figure out both how long there is until the next nearest timer expires + and which timer (handle) we should take care of now. Of course, the upside + of all this is that we get a [`curl_multi_timeout()`][8] that should also + work with old-style applications that use [`curl_multi_perform()`][11]. + + We created an internal "socket to easy handles" hash table that given + a socket (file descriptor) returns the easy handle that waits for action on + that socket. This hash is made using the already existing hash code + (previously only used for the DNS cache). + + To make libcurl able to report plain sockets in the socket callback, we had + to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that + the conversion from sockets to `fd_sets` for that function is only done in + the last step before the data is returned. I also had to extend c-ares to + get a function that can return plain sockets, as that library too returned + only `fd_sets` and that is no longer good enough. The changes done to c-ares + are available in c-ares 1.3.1 and later. + + +Structs in libcurl +================== + +This section should cover 7.32.0 pretty accurately, but will make sense even +for older and later versions as things don't change drastically that often. + + +## Curl_easy + + The `Curl_easy` struct is the one returned to the outside in the external API + as a `CURL *`. This is usually known as an easy handle in API documentations + and examples. + + Information and state that is related to the actual connection is in the + `connectdata` struct. When a transfer is about to be made, libcurl will + either create a new connection or re-use an existing one. The particular + connectdata that is used by this handle is pointed out by + `Curl_easy->easy_conn`. + + Data and information that regard this particular single transfer is put in + the `SingleRequest` sub-struct. + + When the `Curl_easy` struct is added to a multi handle, as it must be in + order to do any transfer, the `->multi` member will point to the `Curl_multi` + struct it belongs to. The `->prev` and `->next` members will then be used by + the multi code to keep a linked list of `Curl_easy` structs that are added to + that same multi handle. libcurl always uses multi so `->multi` *will* point + to a `Curl_multi` when a transfer is in progress. + + `->mstate` is the multi state of this particular `Curl_easy`. When + `multi_runsingle()` is called, it will act on this handle according to which + state it is in. The mstate is also what tells which sockets to return for a + specific `Curl_easy` when [`curl_multi_fdset()`][12] is called etc. + + The libcurl source code generally use the name `data` for the variable that + points to the `Curl_easy`. + + When doing multiplexed HTTP/2 transfers, each `Curl_easy` is associated with + an individual stream, sharing the same connectdata struct. Multiplexing + makes it even more important to keep things associated with the right thing! + + +## connectdata + + A general idea in libcurl is to keep connections around in a connection + "cache" after they have been used in case they will be used again and then + re-use an existing one instead of creating a new as it creates a significant + performance boost. + + Each `connectdata` identifies a single physical connection to a server. If + the connection can't be kept alive, the connection will be closed after use + and then this struct can be removed from the cache and freed. + + Thus, the same `Curl_easy` can be used multiple times and each time select + another `connectdata` struct to use for the connection. Keep this in mind, + as it is then important to consider if options or choices are based on the + connection or the `Curl_easy`. + + Functions in libcurl will assume that `connectdata->data` points to the + `Curl_easy` that uses this connection (for the moment). + + As a special complexity, some protocols supported by libcurl require a + special disconnect procedure that is more than just shutting down the + socket. It can involve sending one or more commands to the server before + doing so. Since connections are kept in the connection cache after use, the + original `Curl_easy` may no longer be around when the time comes to shut down + a particular connection. For this purpose, libcurl holds a special dummy + `closure_handle` `Curl_easy` in the `Curl_multi` struct to use when needed. + + FTP uses two TCP connections for a typical transfer but it keeps both in + this single struct and thus can be considered a single connection for most + internal concerns. + + The libcurl source code generally use the name `conn` for the variable that + points to the connectdata. + + +## Curl_multi + + Internally, the easy interface is implemented as a wrapper around multi + interface functions. This makes everything multi interface. + + `Curl_multi` is the multi handle struct exposed as `CURLM *` in external + APIs. + + This struct holds a list of `Curl_easy` structs that have been added to this + handle with [`curl_multi_add_handle()`][13]. The start of the list is + `->easyp` and `->num_easy` is a counter of added `Curl_easy`s. + + `->msglist` is a linked list of messages to send back when + [`curl_multi_info_read()`][14] is called. Basically a node is added to that + list when an individual `Curl_easy`'s transfer has completed. + + `->hostcache` points to the name cache. It is a hash table for looking up + name to IP. The nodes have a limited life time in there and this cache is + meant to reduce the time for when the same name is wanted within a short + period of time. + + `->timetree` points to a tree of `Curl_easy`s, sorted by the remaining time + until it should be checked - normally some sort of timeout. Each `Curl_easy` + has one node in the tree. + + `->sockhash` is a hash table to allow fast lookups of socket descriptor for + which `Curl_easy` uses that descriptor. This is necessary for the + `multi_socket` API. + + `->conn_cache` points to the connection cache. It keeps track of all + connections that are kept after use. The cache has a maximum size. + + `->closure_handle` is described in the `connectdata` section. + + The libcurl source code generally use the name `multi` for the variable that + points to the `Curl_multi` struct. + + +## Curl_handler + + Each unique protocol that is supported by libcurl needs to provide at least + one `Curl_handler` struct. It defines what the protocol is called and what + functions the main code should call to deal with protocol specific issues. + In general, there's a source file named `[protocol].c` in which there's a + `struct Curl_handler Curl_handler_[protocol]` declared. In `url.c` there's + then the main array with all individual `Curl_handler` structs pointed to + from a single array which is scanned through when a URL is given to libcurl + to work with. + + `->scheme` is the URL scheme name, usually spelled out in uppercase. That's + "HTTP" or "FTP" etc. SSL versions of the protocol need their own + `Curl_handler` setup so HTTPS separate from HTTP. + + `->setup_connection` is called to allow the protocol code to allocate + protocol specific data that then gets associated with that `Curl_easy` for + the rest of this transfer. It gets freed again at the end of the transfer. + It will be called before the `connectdata` for the transfer has been + selected/created. Most protocols will allocate its private + `struct [PROTOCOL]` here and assign `Curl_easy->req.protop` to point to it. + + `->connect_it` allows a protocol to do some specific actions after the TCP + connect is done, that can still be considered part of the connection phase. + + Some protocols will alter the `connectdata->recv[]` and + `connectdata->send[]` function pointers in this function. + + `->connecting` is similarly a function that keeps getting called as long as + the protocol considers itself still in the connecting phase. + + `->do_it` is the function called to issue the transfer request. What we call + the DO action internally. If the DO is not enough and things need to be kept + getting done for the entire DO sequence to complete, `->doing` is then + usually also provided. Each protocol that needs to do multiple commands or + similar for do/doing need to implement their own state machines (see SCP, + SFTP, FTP). Some protocols (only FTP and only due to historical reasons) has + a separate piece of the DO state called `DO_MORE`. + + `->doing` keeps getting called while issuing the transfer request command(s) + + `->done` gets called when the transfer is complete and DONE. That's after the + main data has been transferred. + + `->do_more` gets called during the `DO_MORE` state. The FTP protocol uses + this state when setting up the second connection. + + `->proto_getsock` + `->doing_getsock` + `->domore_getsock` + `->perform_getsock` + Functions that return socket information. Which socket(s) to wait for which + action(s) during the particular multi state. + + `->disconnect` is called immediately before the TCP connection is shutdown. + + `->readwrite` gets called during transfer to allow the protocol to do extra + reads/writes + + `->defport` is the default report TCP or UDP port this protocol uses + + `->protocol` is one or more bits in the `CURLPROTO_*` set. The SSL versions + have their "base" protocol set and then the SSL variation. Like + "HTTP|HTTPS". + + `->flags` is a bitmask with additional information about the protocol that will + make it get treated differently by the generic engine: + + - `PROTOPT_SSL` - will make it connect and negotiate SSL + + - `PROTOPT_DUAL` - this protocol uses two connections + + - `PROTOPT_CLOSEACTION` - this protocol has actions to do before closing the + connection. This flag is no longer used by code, yet still set for a bunch + of protocol handlers. + + - `PROTOPT_DIRLOCK` - "direction lock". The SSH protocols set this bit to + limit which "direction" of socket actions that the main engine will + concern itself with. + + - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read `file:`) + + - `PROTOPT_NEEDSPWD` - this protocol needs a password and will use a default + one unless one is provided + + - `PROTOPT_NOURLQUERY` - this protocol can't handle a query part on the URL + (?foo=bar) + + +## conncache + + Is a hash table with connections for later re-use. Each `Curl_easy` has a + pointer to its connection cache. Each multi handle sets up a connection + cache that all added `Curl_easy`s share by default. + + +## Curl_share + + The libcurl share API allocates a `Curl_share` struct, exposed to the + external API as `CURLSH *`. + + The idea is that the struct can have a set of its own versions of caches and + pools and then by providing this struct in the `CURLOPT_SHARE` option, those + specific `Curl_easy`s will use the caches/pools that this share handle + holds. + + Then individual `Curl_easy` structs can be made to share specific things + that they otherwise wouldn't, such as cookies. + + The `Curl_share` struct can currently hold cookies, DNS cache and the SSL + session cache. + + +## CookieInfo + + This is the main cookie struct. It holds all known cookies and related + information. Each `Curl_easy` has its own private `CookieInfo` even when + they are added to a multi handle. They can be made to share cookies by using + the share API. + + +[1]: https://curl.haxx.se/libcurl/c/curl_easy_setopt.html +[2]: https://curl.haxx.se/libcurl/c/curl_easy_init.html +[3]: https://c-ares.haxx.se/ +[4]: https://tools.ietf.org/html/rfc7230 "RFC 7230" +[5]: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html +[6]: https://curl.haxx.se/docs/manpage.html#--compressed +[7]: https://curl.haxx.se/libcurl/c/curl_multi_socket_action.html +[8]: https://curl.haxx.se/libcurl/c/curl_multi_timeout.html +[9]: https://curl.haxx.se/libcurl/c/curl_multi_setopt.html +[10]: https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html +[11]: https://curl.haxx.se/libcurl/c/curl_multi_perform.html +[12]: https://curl.haxx.se/libcurl/c/curl_multi_fdset.html +[13]: https://curl.haxx.se/libcurl/c/curl_multi_add_handle.html +[14]: https://curl.haxx.se/libcurl/c/curl_multi_info_read.html +[15]: https://tools.ietf.org/html/rfc7231#section-3.1.2.2 diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS new file mode 100644 index 0000000000..26f21dc676 --- /dev/null +++ b/docs/KNOWN_BUGS @@ -0,0 +1,758 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + Known Bugs + +These are problems and bugs known to exist at the time of this release. Feel +free to join in and help us correct one or more of these! Also be sure to +check the changelog of the current development status, as one or more of these +problems may have been fixed or changed somewhat since this was written! + + 1. HTTP + 1.2 Multiple methods in a single WWW-Authenticate: header + 1.3 STARTTRANSFER time is wrong for HTTP POSTs + 1.4 multipart formposts file name encoding + 1.5 Expect-100 meets 417 + 1.6 Unnecessary close when 401 received waiting for 100 + 1.7 Deflate error after all content was received + 1.8 DoH isn't used for all name resolves when enabled + 1.9 HTTP/2 frames while in the connection pool kill reuse + 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM + + 2. TLS + 2.1 CURLINFO_SSL_VERIFYRESULT has limited support + 2.2 DER in keychain + 2.3 GnuTLS backend skips really long certificate fields + 2.4 DarwinSSL won't import PKCS#12 client certificates without a password + 2.5 Client cert handling with Issuer DN differs between backends + 2.6 CURL_GLOBAL_SSL + 2.7 Client cert (MTLS) issues with Schannel + 2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname + 2.9 TLS session cache doesn't work with TFO + + 3. Email protocols + 3.1 IMAP SEARCH ALL truncated response + 3.2 No disconnect command + 3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses + 3.4 AUTH PLAIN for SMTP is not working on all servers + + 4. Command line + 4.1 -J and -O with %-encoded file names + 4.2 -J with -C - fails + 4.3 --retry and transfer timeouts + 4.4 --upload-file . hang if delay in STDIN + 4.5 Improve --data-urlencode space encoding + + 5. Build and portability issues + 5.1 USE_UNIX_SOCKETS on Windows + 5.2 curl-config --libs contains private details + 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 + 5.4 Cannot compile against a static build of OpenLDAP + 5.5 can't handle Unicode arguments in Windows + 5.6 cmake support gaps + 5.7 Visual Studio project gaps + 5.8 configure finding libs in wrong directory + 5.9 Utilize Requires.private directives in libcurl.pc + 5.10 IDN tests failing on Windows / MSYS2 + 5.11 configure --with-gssapi with Heimdal is ignored on macOS + + 6. Authentication + 6.1 NTLM authentication and unicode + 6.2 MIT Kerberos for Windows build + 6.3 NTLM in system context uses wrong name + 6.4 Negotiate and Kerberos V5 need a fake user name + 6.5 NTLM doesn't support password with § character + 6.6 libcurl can fail to try alternatives with --proxy-any + 6.7 Don't clear digest for single realm + + 7. FTP + 7.1 FTP without or slow 220 response + 7.2 FTP with CONNECT and slow server + 7.3 FTP with NOBODY and FAILONERROR + 7.4 FTP with ACCT + 7.5 ASCII FTP + 7.6 FTP with NULs in URL parts + 7.7 FTP and empty path parts in the URL + 7.8 Premature transfer end but healthy control channel + 7.9 Passive transfer tries only one IP address + 7.10 Stick to same family over SOCKS proxy + + 8. TELNET + 8.1 TELNET and time limitations don't work + 8.2 Microsoft telnet server + + 9. SFTP and SCP + 9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct + + 10. SOCKS + 10.3 FTPS over SOCKS + 10.4 active FTP over a SOCKS + + 11. Internals + 11.1 Curl leaks .onion hostnames in DNS + 11.2 error buffer not set if connection to multiple addresses fails + 11.3 c-ares deviates from stock resolver on http://1346569778 + 11.4 HTTP test server 'connection-monitor' problems + 11.5 Connection information when using TCP Fast Open + 11.6 slow connect to localhost on Windows + 11.7 signal-based resolver timeouts + + 12. LDAP and OpenLDAP + 12.1 OpenLDAP hangs after returning results + 12.2 LDAP on Windows does authentication wrong? + 12.3 LDAP on Windows doesn't work + + 13. TCP/IP + 13.1 --interface for ipv6 binds to unusable IP address + + 14 DICT + 14.1 DICT responses show the underlying protocol + +============================================================================== + +1. HTTP + +1.2 Multiple methods in a single WWW-Authenticate: header + + The HTTP responses headers WWW-Authenticate: can provide information about + multiple authentication methods as multiple headers or as several methods + within a single header. The latter way, several methods in the same physical + line, is not supported by libcurl's parser. (For no good reason.) + +1.3 STARTTRANSFER time is wrong for HTTP POSTs + + Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with + GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME + is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus + CURLINFO_PRETRANSFER_TIME is near to zero every time. + + https://github.com/curl/curl/issues/218 + https://curl.haxx.se/bug/view.cgi?id=1213 + +1.4 multipart formposts file name encoding + + When creating multipart formposts. The file name part can be encoded with + something beyond ascii but currently libcurl will only pass in the verbatim + string the app provides. There are several browsers that already do this + encoding. The key seems to be the updated draft to RFC2231: + https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 + +1.5 Expect-100 meets 417 + + If an upload using Expect: 100-continue receives an HTTP 417 response, it + ought to be automatically resent without the Expect:. A workaround is for + the client application to redo the transfer after disabling Expect:. + https://curl.haxx.se/mail/archive-2008-02/0043.html + +1.6 Unnecessary close when 401 received waiting for 100 + + libcurl closes the connection if an HTTP 401 reply is received while it is + waiting for the 100-continue response. + https://curl.haxx.se/mail/lib-2008-08/0462.html + +1.7 Deflate error after all content was received + + There's a situation where we can get an error in a HTTP response that is + compressed, when that error is detected after all the actual body contents + have been received and delivered to the application. This is tricky, but is + ultimately a broken server. + + See https://github.com/curl/curl/issues/2719 + +1.8 DoH isn't used for all name resolves when enabled + + Even if DoH is specified to be used, there are some name resolves that are + done without it. This should be fixed. When the internal function + `Curl_resolver_wait_resolv()` is called, it doesn't use DoH to complete the + resolve as it otherwise should. + + See https://github.com/curl/curl/pull/3857 and + https://github.com/curl/curl/pull/3850 + +1.9 HTTP/2 frames while in the connection pool kill reuse + + If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to + curl while the connection is held in curl's connection pool, the socket will + be found readable when considered for reuse and that makes curl think it is + dead and then it will be closed and a new connection gets created instead. + + This is *best* fixed by adding monitoring to connections while they are kept + in the pool so that pings can be responded to appropriately. + +1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM + + I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM + option of curl_formadd(). I've noticed that if the connection drops at just + the right time, the POST is reattempted without the data from the file. It + seems like the file stream position isn't getting reset to the beginning of + the file. I found the CURLOPT_SEEKFUNCTION option and set that with a + function that performs an fseek() on the FILE*. However, setting that didn't + seem to fix the issue or even get called. See + https://github.com/curl/curl/issues/768 + + +2. TLS + +2.1 CURLINFO_SSL_VERIFYRESULT has limited support + + CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS + backends, so relying on this information in a generic app is flaky. + +2.2 DER in keychain + + Curl doesn't recognize certificates in DER format in keychain, but it works + with PEM. https://curl.haxx.se/bug/view.cgi?id=1065 + +2.3 GnuTLS backend skips really long certificate fields + + libcurl calls gnutls_x509_crt_get_dn() with a fixed buffer size and if the + field is too long in the cert, it'll just return an error and the field will + be displayed blank. + +2.4 DarwinSSL won't import PKCS#12 client certificates without a password + + libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that + function rejects certificates that do not have a password. + https://github.com/curl/curl/issues/1308 + +2.5 Client cert handling with Issuer DN differs between backends + + When the specified client certificate doesn't match any of the + server-specified DNs, the OpenSSL and GnuTLS backends behave differently. + The github discussion may contain a solution. + + See https://github.com/curl/curl/issues/1411 + +2.6 CURL_GLOBAL_SSL + + Since libcurl 7.57.0, the flag CURL_GLOBAL_SSL is a no-op. The change was + merged in https://github.com/curl/curl/commit/d661b0afb571a + + It was removed since it was + + A) never clear for applications on how to deal with init in the light of + different SSL backends (the option was added back in the days when life + was simpler) + + B) multissl introduced dynamic switching between SSL backends which + emphasized (A) even more + + C) libcurl uses some TLS backend functionality even for non-TLS functions (to + get "good" random) so applications trying to avoid the init for + performance reasons would do wrong anyway + + D) never very carefully documented so all this mostly just happened to work + for some users + + However, in spite of the problems with the feature, there were some users who + apparently depended on this feature and who now claim libcurl is broken for + them. The fix for this situation is not obvious as a downright revert of the + patch is totally ruled out due to those reasons above. + + https://github.com/curl/curl/issues/2276 + +2.7 Client cert (MTLS) issues with Schannel + + See https://github.com/curl/curl/issues/3145 + +2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname + + This seems to be a limitation in the underlying Schannel API. + + https://github.com/curl/curl/issues/3284 + +2.9 TLS session cache doesn't work with TFO + + See https://github.com/curl/curl/issues/4301 + +3. Email protocols + +3.1 IMAP SEARCH ALL truncated response + + IMAP "SEARCH ALL" truncates output on large boxes. "A quick search of the + code reveals that pingpong.c contains some truncation code, at line 408, when + it deems the server response to be too large truncating it to 40 characters" + https://curl.haxx.se/bug/view.cgi?id=1366 + +3.2 No disconnect command + + The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 and + SMTP if a failure occurs during the authentication phase of a connection. + +3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses + + You have to tell libcurl not to expect a body, when dealing with one line + response commands. Please see the POP3 examples and test cases which show + this for the NOOP and DELE commands. https://curl.haxx.se/bug/?i=740 + +3.4 AUTH PLAIN for SMTP is not working on all servers + + Specifying "--login-options AUTH=PLAIN" on the command line doesn't seem to + work correctly. + + See https://github.com/curl/curl/issues/4080 + +4. Command line + +4.1 -J and -O with %-encoded file names + + -J/--remote-header-name doesn't decode %-encoded file names. RFC6266 details + how it should be done. The can of worm is basically that we have no charset + handling in curl and ascii >=128 is a challenge for us. Not to mention that + decoding also means that we need to check for nastiness that is attempted, + like "../" sequences and the like. Probably everything to the left of any + embedded slashes should be cut off. + https://curl.haxx.se/bug/view.cgi?id=1294 + + -O also doesn't decode %-encoded names, and while it has even less + information about the charset involved the process is similar to the -J case. + + Note that we won't add decoding to -O without the user asking for it with + some other means as well, since -O has always been documented to use the name + exactly as specified in the URL. + +4.2 -J with -C - fails + + When using -J (with -O), automatically resumed downloading together with "-C + -" fails. Without -J the same command line works! This happens because the + resume logic is worked out before the target file name (and thus its + pre-transfer size) has been figured out! + https://curl.haxx.se/bug/view.cgi?id=1169 + +4.3 --retry and transfer timeouts + + If using --retry and the transfer timeouts (possibly due to using -m or + -y/-Y) the next attempt doesn't resume the transfer properly from what was + downloaded in the previous attempt but will truncate and restart at the + original position where it was at before the previous failed attempt. See + https://curl.haxx.se/mail/lib-2008-01/0080.html and Mandriva bug report + https://qa.mandriva.com/show_bug.cgi?id=22565 + +4.4 --upload-file . hangs if delay in STDIN + + "(echo start; sleep 1; echo end) | curl --upload-file . http://mywebsite -vv" + + ... causes a hang when it shouldn't. + + See https://github.com/curl/curl/issues/2051 + +4.5 Improve --data-urlencode space encoding + + ASCII space characters in --data-urlencode are currently encoded as %20 + rather than +, which RFC 1866 says should be used. + + See https://github.com/curl/curl/issues/3229 + +5. Build and portability issues + +5.1 USE_UNIX_SOCKETS on Windows + + Due to incorrect CMake checks for the presence of the feature, it will never + be enabled for windows in a cmake build. + + See https://github.com/curl/curl/issues/4040 + +5.2 curl-config --libs contains private details + + "curl-config --libs" will include details set in LDFLAGS when configure is + run that might be needed only for building libcurl. Further, curl-config + --cflags suffers from the same effects with CFLAGS/CPPFLAGS. + +5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 + + See https://github.com/curl/curl/issues/2905 + +5.4 Cannot compile against a static build of OpenLDAP + + See https://github.com/curl/curl/issues/2367 + +5.5 can't handle Unicode arguments in Windows + + If a URL or filename can't be encoded using the user's current codepage then + it can only be encoded properly in the Unicode character set. Windows uses + UTF-16 encoding for Unicode and stores it in wide characters, however curl + and libcurl are not equipped for that at the moment. And, except for Cygwin, + Windows can't use UTF-8 as a locale. + + https://curl.haxx.se/bug/?i=345 + https://curl.haxx.se/bug/?i=731 + +5.6 cmake support gaps + + The cmake build setup lacks several features that the autoconf build + offers. This includes: + + - use of correct soname for the shared library build + + - support for several TLS backends are missing + + - the unit tests cause link failures in regular non-static builds + + - no nghttp2 check + + - unusable tool_hugehelp.c with MinGW, see + https://github.com/curl/curl/issues/3125 + +5.7 Visual Studio project gaps + + The Visual Studio projects lack some features that the autoconf and nmake + builds offer, such as the following: + + - support for zlib and nghttp2 + - use of static runtime libraries + - add the test suite components + + In addition to this the following could be implemented: + + - support for other development IDEs + - add PATH environment variables for third-party DLLs + +5.8 configure finding libs in wrong directory + + When the configure script checks for third-party libraries, it adds those + directories to the LDFLAGS variable and then tries linking to see if it + works. When successful, the found directory is kept in the LDFLAGS variable + when the script continues to execute and do more tests and possibly check for + more libraries. + + This can make subsequent checks for libraries wrongly detect another + installation in a directory that was previously added to LDFLAGS by another + library check! + + A possibly better way to do these checks would be to keep the pristine LDFLAGS + even after successful checks and instead add those verified paths to a + separate variable that only after all library checks have been performed gets + appended to LDFLAGS. + +5.9 Utilize Requires.private directives in libcurl.pc + + https://github.com/curl/curl/issues/864 + +5.10 IDN tests failing on Windows / MSYS2 + + It seems like MSYS2 does some UTF-8-to-something-else conversion for Windows + compatibility. + + https://github.com/curl/curl/issues/3747 + +5.11 configure --with-gssapi with Heimdal is ignored on macOS + + ... unless you also pass --with-gssapi-libs + + https://github.com/curl/curl/issues/3841 + +6. Authentication + +6.1 NTLM authentication and unicode + + NTLM authentication involving unicode user name or password only works + properly if built with UNICODE defined together with the WinSSL/Schannel + backend. The original problem was mentioned in: + https://curl.haxx.se/mail/lib-2009-10/0024.html + https://curl.haxx.se/bug/view.cgi?id=896 + + The WinSSL/Schannel version verified to work as mentioned in + https://curl.haxx.se/mail/lib-2012-07/0073.html + +6.2 MIT Kerberos for Windows build + + libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's + library header files exporting symbols/macros that should be kept private to + the KfW library. See ticket #5601 at https://krbdev.mit.edu/rt/ + +6.3 NTLM in system context uses wrong name + + NTLM authentication using SSPI (on Windows) when (lib)curl is running in + "system context" will make it use wrong(?) user name - at least when compared + to what winhttp does. See https://curl.haxx.se/bug/view.cgi?id=535 + +6.4 Negotiate and Kerberos V5 need a fake user name + + In order to get Negotiate (SPNEGO) authentication to work in HTTP or Kerberos + V5 in the e-mail protocols, you need to provide a (fake) user name (this + concerns both curl and the lib) because the code wrongly only considers + authentication if there's a user name provided by setting + conn->bits.user_passwd in url.c https://curl.haxx.se/bug/view.cgi?id=440 How? + https://curl.haxx.se/mail/lib-2004-08/0182.html A possible solution is to + either modify this variable to be set or introduce a variable such as + new conn->bits.want_authentication which is set when any of the authentication + options are set. + +6.5 NTLM doesn't support password with § character + + https://github.com/curl/curl/issues/2120 + +6.6 libcurl can fail to try alternatives with --proxy-any + + When connecting via a proxy using --proxy-any, a failure to establish an + authentication will cause libcurl to abort trying other options if the + failed method has a higher preference than the alternatives. As an example, + --proxy-any against a proxy which advertise Negotiate and NTLM, but which + fails to set up Kerberos authentication won't proceed to try authentication + using NTLM. + + https://github.com/curl/curl/issues/876 + +6.7 Don't clear digest for single realm + + https://github.com/curl/curl/issues/3267 + +7. FTP + +7.1 FTP without or slow 220 response + + If a connection is made to a FTP server but the server then just never sends + the 220 response or otherwise is dead slow, libcurl will not acknowledge the + connection timeout during that phase but only the "real" timeout - which may + surprise users as it is probably considered to be the connect phase to most + people. Brought up (and is being misunderstood) in: + https://curl.haxx.se/bug/view.cgi?id=856 + +7.2 FTP with CONNECT and slow server + + When doing FTP over a socks proxy or CONNECT through HTTP proxy and the multi + interface is used, libcurl will fail if the (passive) TCP connection for the + data transfer isn't more or less instant as the code does not properly wait + for the connect to be confirmed. See test case 564 for a first shot at a test + case. + +7.3 FTP with NOBODY and FAILONERROR + + It seems sensible to be able to use CURLOPT_NOBODY and CURLOPT_FAILONERROR + with FTP to detect if a file exists or not, but it is not working: + https://curl.haxx.se/mail/lib-2008-07/0295.html + +7.4 FTP with ACCT + + When doing an operation over FTP that requires the ACCT command (but not when + logging in), the operation will fail since libcurl doesn't detect this and + thus fails to issue the correct command: + https://curl.haxx.se/bug/view.cgi?id=635 + +7.5 ASCII FTP + + FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 + clearly describes how this should be done: + + The sender converts the data from an internal character representation to + the standard 8-bit NVT-ASCII representation (see the Telnet + specification). The receiver will convert the data from the standard + form to his own internal form. + + Since 7.15.4 at least line endings are converted. + +7.6 FTP with NULs in URL parts + + FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 , + , and components, encoded as "%00". The problem is that + curl_unescape does not detect this, but instead returns a shortened C string. + From a strict FTP protocol standpoint, NUL is a valid character within RFC + 959 , so the way to handle this correctly in curl would be to use a + data structure other than a plain C string, one that can handle embedded NUL + characters. From a practical standpoint, most FTP servers would not + meaningfully support NUL characters within RFC 959 , anyway (e.g., + Unix pathnames may not contain NUL). + +7.7 FTP and empty path parts in the URL + + libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that + such parts should be sent to the server as 'CWD ' (without an argument). The + only exception to this rule, is that we knowingly break this if the empty + part is first in the path, as then we use the double slashes to indicate that + the user wants to reach the root dir (this exception SHALL remain even when + this bug is fixed). + +7.8 Premature transfer end but healthy control channel + + When 'multi_done' is called before the transfer has been completed the normal + way, it is considered a "premature" transfer end. In this situation, libcurl + closes the connection assuming it doesn't know the state of the connection so + it can't be reused for subsequent requests. + + With FTP however, this isn't necessarily true but there are a bunch of + situations (listed in the ftp_done code) where it *could* keep the connection + alive even in this situation - but the current code doesn't. Fixing this would + allow libcurl to reuse FTP connections better. + +7.9 Passive transfer tries only one IP address + + When doing FTP operations through a proxy at localhost, the reported spotted + that curl only tried to connect once to the proxy, while it had multiple + addresses and a failed connect on one address should make it try the next. + + After switching to passive mode (EPSV), curl should try all IP addresses for + "localhost". Currently it tries ::1, but it should also try 127.0.0.1. + + See https://github.com/curl/curl/issues/1508 + +7.10 Stick to same family over SOCKS proxy + + When asked to do FTP over a SOCKS proxy, it might connect to the proxy (and + then subsequently to the remote server) using for example IPv4. When doing + the second connection, curl should make sure that the second connection is + using the same IP protocol version as the first connection did and not try + others, since the remote server will only accept the same. + + See https://curl.haxx.se/mail/archive-2018-07/0000.html + +8. TELNET + +8.1 TELNET and time limitations don't work + + When using telnet, the time limitation options don't work. + https://curl.haxx.se/bug/view.cgi?id=846 + +8.2 Microsoft telnet server + + There seems to be a problem when connecting to the Microsoft telnet server. + https://curl.haxx.se/bug/view.cgi?id=649 + + +9. SFTP and SCP + +9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct + + When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP server + using the multi interface, the commands are not being sent correctly and + instead the connection is "cancelled" (the operation is considered done) + prematurely. There is a half-baked (busy-looping) patch provided in the bug + report but it cannot be accepted as-is. See + https://curl.haxx.se/bug/view.cgi?id=748 + + +10. SOCKS + +10.3 FTPS over SOCKS + + libcurl doesn't support FTPS over a SOCKS proxy. + +10.4 active FTP over a SOCKS + + libcurl doesn't support active FTP over a SOCKS proxy + + +11. Internals + +11.1 Curl leaks .onion hostnames in DNS + + Curl sends DNS requests for hostnames with a .onion TLD. This leaks + information about what the user is attempting to access, and violates this + requirement of RFC7686: https://tools.ietf.org/html/rfc7686 + + Issue: https://github.com/curl/curl/issues/543 + +11.2 error buffer not set if connection to multiple addresses fails + + If you ask libcurl to resolve a hostname like example.com to IPv6 addresses + only. But you only have IPv4 connectivity. libcurl will correctly fail with + CURLE_COULDNT_CONNECT. But the error buffer set by CURLOPT_ERRORBUFFER + remains empty. Issue: https://github.com/curl/curl/issues/544 + +11.3 c-ares deviates from stock resolver on http://1346569778 + + When using the socket resolvers, that URL becomes: + + * Rebuilt URL to: http://1346569778/ + * Trying 80.67.6.50... + + but with c-ares it instead says "Could not resolve: 1346569778 (Domain name + not found)" + + See https://github.com/curl/curl/issues/893 + +11.4 HTTP test server 'connection-monitor' problems + + The 'connection-monitor' feature of the sws HTTP test server doesn't work + properly if some tests are run in unexpected order. Like 1509 and then 1525. + + See https://github.com/curl/curl/issues/868 + +11.5 Connection information when using TCP Fast Open + + CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is + enabled. + + See https://github.com/curl/curl/issues/1332 and + https://github.com/curl/curl/issues/4296 + +11.6 slow connect to localhost on Windows + + When connecting to "localhost" on Windows, curl will resolve the name for + both ipv4 and ipv6 and try to connect to both happy eyeballs-style. Something + in there does however make it take 200 milliseconds to succeed - which is the + HAPPY_EYEBALLS_TIMEOUT define exactly. Lowering that define speeds up the + connection, suggesting a problem in the HE handling. + + If we can *know* that we're talking to a local host, we should lower the + happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost" + addresses, mentioned in TODO). Possibly we should reduce that delay for all. + + https://github.com/curl/curl/issues/2281 + +11.7 signal-based resolver timeouts + + libcurl built without an asynchronous resolver library uses alarm() to time + out DNS lookups. When a timeout occurs, this causes libcurl to jump from the + signal handler back into the library with a sigsetjmp, which effectively + causes libcurl to continue running within the signal handler. This is + non-portable and could cause problems on some platforms. A discussion on the + problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html + + Also, alarm() provides timeout resolution only to the nearest second. alarm + ought to be replaced by setitimer on systems that support it. + + +12. LDAP and OpenLDAP + +12.1 OpenLDAP hangs after returning results + + By configuration defaults, openldap automatically chase referrals on + secondary socket descriptors. The OpenLDAP backend is asynchronous and thus + should monitor all socket descriptors involved. Currently, these secondary + descriptors are not monitored, causing openldap library to never receive + data from them. + + As a temporary workaround, disable referrals chasing by configuration. + + The fix is not easy: proper automatic referrals chasing requires a + synchronous bind callback and monitoring an arbitrary number of socket + descriptors for a single easy handle (currently limited to 5). + + Generic LDAP is synchronous: OK. + + See https://github.com/curl/curl/issues/622 and + https://curl.haxx.se/mail/lib-2016-01/0101.html + +12.2 LDAP on Windows does authentication wrong? + + https://github.com/curl/curl/issues/3116 + +12.3 LDAP on Windows doesn't work + + A simple curl command line getting "ldap://ldap.forumsys.com" returns an + error that says "no memory" ! + + https://github.com/curl/curl/issues/4261 + +13. TCP/IP + +13.1 --interface for ipv6 binds to unusable IP address + + Since IPv6 provides a lot of addresses with different scope, binding to an + IPv6 address needs to take the proper care so that it doesn't bind to a + locally scoped address as that is bound to fail. + + https://github.com/curl/curl/issues/686 + +14. DICT + +14.1 DICT responses show the underlying protocol + + When getting a DICT response, the protocol parts of DICT aren't stripped off + from the output. + + https://github.com/curl/curl/issues/1809 diff --git a/docs/LICENSE-MIXING.md b/docs/LICENSE-MIXING.md new file mode 100644 index 0000000000..1083a2dcd0 --- /dev/null +++ b/docs/LICENSE-MIXING.md @@ -0,0 +1,128 @@ +License Mixing +============== + +libcurl can be built to use a fair amount of various third party libraries, +libraries that are written and provided by other parties that are distributed +using their own licenses. Even libcurl itself contains code that may cause +problems to some. This document attempts to describe what licenses libcurl and +the other libraries use and what possible dilemmas linking and mixing them all +can lead to for end users. + +I am not a lawyer and this is not legal advice! + +One common dilemma is that [GPL](https://www.gnu.org/licenses/gpl.html) +licensed code is not allowed to be linked with code licensed under the +[Original BSD license](https://spdx.org/licenses/BSD-4-Clause.html) (with the +announcement clause). You may still build your own copies that use them all, +but distributing them as binaries would be to violate the GPL license - unless +you accompany your license with an +[exception](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs). This +particular problem was addressed when the [Modified BSD +license](https://opensource.org/licenses/BSD-3-Clause) was created, which does +not have the announcement clause that collides with GPL. + +## libcurl + + Uses an [MIT style license](https://curl.haxx.se/docs/copyright.html) that is + very liberal. + +## OpenSSL + + (May be used for SSL/TLS support) Uses an Original BSD-style license with an + announcement clause that makes it "incompatible" with GPL. You are not + allowed to ship binaries that link with OpenSSL that includes GPL code + (unless that specific GPL code includes an exception for OpenSSL - a habit + that is growing more and more common). If OpenSSL's licensing is a problem + for you, consider using another TLS library. + +## GnuTLS + + (May be used for SSL/TLS support) Uses the + [LGPL](https://www.gnu.org/licenses/lgpl.html) license. If this is a problem + for you, consider using another TLS library. Also note that GnuTLS itself + depends on and uses other libs (libgcrypt and libgpg-error) and they too are + LGPL- or GPL-licensed. + +## WolfSSL + + (May be used for SSL/TLS support) Uses the GPL license or a proprietary + license. If this is a problem for you, consider using another TLS library. + +## NSS + + (May be used for SSL/TLS support) Is covered by the + [MPL](https://www.mozilla.org/MPL/) license, the GPL license and the LGPL + license. You may choose to license the code under MPL terms, GPL terms, or + LGPL terms. These licenses grant you different permissions and impose + different obligations. You should select the license that best meets your + needs. + +## mbedTLS + + (May be used for SSL/TLS support) Uses the [Apache 2.0 + license](https://opensource.org/licenses/Apache-2.0) or the GPL license. + You may choose to license the code under Apache 2.0 terms or GPL terms. + These licenses grant you different permissions and impose different + obligations. You should select the license that best meets your needs. + +## BoringSSL + + (May be used for SSL/TLS support) As an OpenSSL fork, it has the same + license as that. + +## libressl + + (May be used for SSL/TLS support) As an OpenSSL fork, it has the same + license as that. + +## BearSSL + + (May be used for SSL/TLS support) Uses an MIT license that is very liberal + and imposes no restrictions on any other library or part you may link with. + +## c-ares + + (Used for asynchronous name resolves) Uses an MIT license that is very + liberal and imposes no restrictions on any other library or part you may link + with. + +## zlib + + (Used for compressed Transfer-Encoding support) Uses an MIT-style license + that shouldn't collide with any other library. + +## MIT Kerberos + + (May be used for GSS support) MIT licensed, that shouldn't collide with any + other parts. + +## Heimdal + + (May be used for GSS support) Heimdal is Original BSD licensed with the + announcement clause. + +## GNU GSS + + (May be used for GSS support) GNU GSS is GPL licensed. Note that you may not + distribute binary curl packages that uses this if you build curl to also link + and use any Original BSD licensed libraries! + +## libidn + + (Used for IDNA support) Uses the GNU Lesser General Public License [3]. LGPL + is a variation of GPL with slightly less aggressive "copyleft". This license + requires more requirements to be met when distributing binaries, see the + license for details. Also note that if you distribute a binary that includes + this library, you must also include the full LGPL license text. Please + properly point out what parts of the distributed package that the license + addresses. + +## OpenLDAP + + (Used for LDAP support) Uses a Modified BSD-style license. Since libcurl uses + OpenLDAP as a shared library only, I have not heard of anyone that ships + OpenLDAP linked with libcurl in an app. + +## libssh2 + + (Used for scp and sftp support) libssh2 uses a Modified BSD-style license. diff --git a/docs/MAIL-ETIQUETTE b/docs/MAIL-ETIQUETTE new file mode 100644 index 0000000000..07660a001d --- /dev/null +++ b/docs/MAIL-ETIQUETTE @@ -0,0 +1,285 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +MAIL ETIQUETTE + + 1. About the lists + 1.1 Mailing Lists + 1.2 Netiquette + 1.3 Do Not Mail a Single Individual + 1.4 Subscription Required + 1.5 Moderation of new posters + 1.6 Handling trolls and spam + 1.7 How to unsubscribe + 1.8 I posted, now what? + 1.9 Your emails are public + + 2. Sending mail + 2.1 Reply or New Mail + 2.2 Reply to the List + 2.3 Use a Sensible Subject + 2.4 Do Not Top-Post + 2.5 HTML is not for mails + 2.6 Quoting + 2.7 Digest + 2.8 Please Tell Us How You Solved The Problem! + +============================================================================== + +1. About the lists + + 1.1 Mailing Lists + + The mailing lists we have are all listed and described at + https://curl.haxx.se/mail/ + + Each mailing list is targeted to a specific set of users and subjects, + please use the one or the ones that suit you the most. + + Each mailing list has hundreds up to thousands of readers, meaning that + each mail sent will be received and read by a very large number of people. + People from various cultures, regions, religions and continents. + + 1.2 Netiquette + + Netiquette is a common term for how to behave on the internet. Of course, in + each particular group and subculture there will be differences in what is + acceptable and what is considered good manners. + + This document outlines what we in the curl project consider to be good + etiquette, and primarily this focus on how to behave on and how to use our + mailing lists. + + 1.3 Do Not Mail a Single Individual + + Many people send one question to one person. One person gets many mails, and + there is only one person who can give you a reply. The question may be + something that other people would also like to ask. These other people have + no way to read the reply, but to ask the one person the question. The one + person consequently gets overloaded with mail. + + If you really want to contact an individual and perhaps pay for his or her + services, by all means go ahead, but if it's just another curl question, + take it to a suitable list instead. + + 1.4 Subscription Required + + All curl mailing lists require that you are subscribed to allow a mail to go + through to all the subscribers. + + If you post without being subscribed (or from a different mail address than + the one you are subscribed with), your mail will simply be silently + discarded. You have to subscribe first, then post. + + The reason for this unfortunate and strict subscription policy is of course + to stop spam from pestering the lists. + + 1.5 Moderation of new posters + + Several of the curl mailing lists automatically make all posts from new + subscribers be moderated. This means that after you've subscribed and + sent your first mail to a list, that mail will not be let through to the + list until a mailing list administrator has verified that it is OK and + permits it to get posted. + + Once a first post has been made that proves the sender is actually talking + about curl-related subjects, the moderation "flag" will be switched off and + future posts will go through without being moderated. + + The reason for this moderation policy is that we do suffer from spammers who + actually subscribe and send spam to our lists. + + 1.6 Handling trolls and spam + + Despite our good intentions and hard work to keep spam off the lists and to + maintain a friendly and positive atmosphere, there will be times when spam + and or trolls get through. + + Troll - "someone who posts inflammatory, extraneous, or off-topic messages + in an online community" + + Spam - "use of electronic messaging systems to send unsolicited bulk + messages" + + No matter what, we NEVER EVER respond to trolls or spammers on the list. If + you believe the list admin should do something in particular, contact him/her + off-list. The subject will be taken care of as much as possible to prevent + repeated offenses, but responding on the list to such messages never leads to + anything good and only puts the light even more on the offender: which was + the entire purpose of it getting sent to the list in the first place. + + Don't feed the trolls! + + 1.7 How to unsubscribe + + You can unsubscribe the same way you subscribed in the first place. You go + to the page for the particular mailing list you're subscribed to and you enter + your email address and password and press the unsubscribe button. + + Also, the instructions to unsubscribe are included in the headers of every + mail that is sent out to all curl related mailing lists and there's a footer + in each mail that links to the "admin" page on which you can unsubscribe and + change other options. + + You NEVER EVER email the mailing list requesting someone else to take you off + the list. + + 1.8 I posted, now what? + + If you aren't subscribed with the exact same email address that you used to + send the email, your post will just be silently discarded. + + If you posted for the first time to the mailing list, you first need to wait + for an administrator to allow your email to go through (moderated). This normally + happens very quickly but in case we're asleep, you may have to wait a few + hours. + + Once your email goes through it is sent out to several hundred or even + thousands of recipients. Your email may cover an area that not that many people + know about or are interested in. Or possibly the person who knows about it + is on vacation or under a very heavy work load right now. You may have to wait + for a response and you should not expect to get a response at all, but + hopefully you get an answer within a couple of days. + + You do yourself and all of us a service when you include as many details as + possible already in your first email. Mention your operating system and + environment. Tell us which curl version you're using and tell us what you + did, what happened and what you expected would happen. Preferably, show us + what you did with details enough to allow others to help point out the problem + or repeat the same steps in their locations. + + Failing to include details will only delay responses and make people respond + and ask for more details and you will have to send a follow-up email that + includes them. + + Expect the responses to primarily help YOU debug the issue, or ask YOU + questions that can lead you or others towards a solution or explanation to + whatever you experience. + + If you are a repeat offender to the guidelines outlined in this document, + chances are that people will ignore you at will and your chances to get + responses in the future will greatly diminish. + + 1.9 Your emails are public + + Your email, its contents and all its headers and the details in those + headers will be received by every subscriber of the mailing list that you + send your email to. + + Your email as sent to a curl mailing list will end up in mail archives, on + the curl web site and elsewhere, for others to see and read. Today and in + the future. In addition to the archives, the mail is sent out to thousands + of individuals. There is no way to undo a sent email. + + When sending emails to a curl mailing list, do not include sensitive + information such as user names and passwords; use fake ones, temporary ones + or just remove them completely from the mail. Note that this includes base64 + encoded HTTP Basic auth headers. + + This public nature of the curl mailing lists makes automatically inserted mail + footers about mails being "private" or "only meant for the recipient" or + similar even more silly than usual. Because they are absolutely not private + when sent to a public mailing list. + + +2. Sending mail + + 2.1 Reply or New Mail + + Please do not reply to an existing message as a short-cut to post a message + to the lists. + + Many mail programs and web archivers use information within mails to keep + them together as "threads", as collections of posts that discuss a certain + subject. If you don't intend to reply on the same or similar subject, don't + just hit reply on an existing mail and change subject, create a new mail. + + 2.2 Reply to the List + + When replying to a message from the list, make sure that you do "group + reply" or "reply to all", and not just reply to the author of the single + mail you reply to. + + We're actively discouraging replying back to the single person by setting + the Reply-To: field in outgoing mails back to the mailing list address, + making it harder for people to mail the author directly, if only by mistake. + + 2.3 Use a Sensible Subject + + Please use a subject of the mail that makes sense and that is related to the + contents of your mail. It makes it a lot easier to find your mail afterwards + and it makes it easier to track mail threads and topics. + + 2.4 Do Not Top-Post + + If you reply to a message, don't use top-posting. Top-posting is when you + write the new text at the top of a mail and you insert the previous quoted + mail conversation below. It forces users to read the mail in a backwards + order to properly understand it. + + This is why top posting is so bad (in top posting order): + + A: Because it messes up the order in which people normally read text. + Q: Why is top-posting such a bad thing? + A: Top-posting. + Q: What is the most annoying thing in e-mail? + + Apart from the screwed up read order (especially when mixed together in a + thread when someone responds using the mandated bottom-posting style), it + also makes it impossible to quote only parts of the original mail. + + When you reply to a mail. You let the mail client insert the previous mail + quoted. Then you put the cursor on the first line of the mail and you move + down through the mail, deleting all parts of the quotes that don't add + context for your comments. When you want to add a comment you do so, inline, + right after the quotes that relate to your comment. Then you continue + downwards again. + + When most of the quotes have been removed and you've added your own words, + you're done! + + 2.5 HTML is not for mails + + Please switch off those HTML encoded messages. You can mail all those funny + mails to your friends. We speak plain text mails. + + 2.6 Quoting + + Quote as little as possible. Just enough to provide the context you cannot + leave out. A lengthy description can be found here: + + https://www.netmeister.org/news/learn2quote.html + + 2.7 Digest + + We allow subscribers to subscribe to the "digest" version of the mailing + lists. A digest is a collection of mails lumped together in one single mail. + + Should you decide to reply to a mail sent out as a digest, there are two + things you MUST consider if you really really cannot subscribe normally + instead: + + Cut off all mails and chatter that is not related to the mail you want to + reply to. + + Change the subject name to something sensible and related to the subject, + preferably even the actual subject of the single mail you wanted to reply to + + 2.8 Please Tell Us How You Solved The Problem! + + Many people mail questions to the list, people spend some of their time and + make an effort in providing good answers to these questions. + + If you are the one who asks, please consider responding once more in case + one of the hints was what solved your problems. The guys who write answers + feel good to know that they provided a good answer and that you fixed the + problem. Far too often, the person who asked the question is never heard from + again, and we never get to know if he/she is gone because the problem was + solved or perhaps because the problem was unsolvable! + + Getting the solution posted also helps other users that experience the same + problem(s). They get to see (possibly in the web archives) that the + suggested fixes actually has helped at least one person. diff --git a/docs/MANUAL.md b/docs/MANUAL.md new file mode 100644 index 0000000000..7063dbc8b1 --- /dev/null +++ b/docs/MANUAL.md @@ -0,0 +1,1011 @@ +# curl tutorial + +## Simple Usage + +Get the main page from Netscape's web-server: + + curl http://www.netscape.com/ + +Get the README file the user's home directory at funet's ftp-server: + + curl ftp://ftp.funet.fi/README + +Get a web page from a server using port 8000: + + curl http://www.weirdserver.com:8000/ + +Get a directory listing of an FTP site: + + curl ftp://cool.haxx.se/ + +Get the definition of curl from a dictionary: + + curl dict://dict.org/m:curl + +Fetch two documents at once: + + curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/ + +Get a file off an FTPS server: + + curl ftps://files.are.secure.com/secrets.txt + +or use the more appropriate FTPS way to get the same file: + + curl --ftp-ssl ftp://files.are.secure.com/secrets.txt + +Get a file from an SSH server using SFTP: + + curl -u username sftp://example.com/etc/issue + +Get a file from an SSH server using SCP using a private key (not +password-protected) to authenticate: + + curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt + +Get a file from an SSH server using SCP using a private key +(password-protected) to authenticate: + + curl -u username: --key ~/.ssh/id_rsa --pass private_key_password + scp://example.com/~/file.txt + +Get the main page from an IPv6 web server: + + curl "http://[2001:1890:1112:1::20]/" + +Get a file from an SMB server: + + curl -u "domain\username:passwd" smb://server.example.com/share/file.txt + +## Download to a File + +Get a web page and store in a local file with a specific name: + + curl -o thatpage.html http://www.netscape.com/ + +Get a web page and store in a local file, make the local file get the name of +the remote document (if no file name part is specified in the URL, this will +fail): + + curl -O http://www.netscape.com/index.html + +Fetch two files and store them with their remote names: + + curl -O www.haxx.se/index.html -O curl.haxx.se/download.html + +## Using Passwords + +### FTP + +To ftp files using name+passwd, include them in the URL like: + + curl ftp://name:passwd@machine.domain:port/full/path/to/file + +or specify them with the -u flag like + + curl -u name:passwd ftp://machine.domain:port/full/path/to/file + +### FTPS + +It is just like for FTP, but you may also want to specify and use SSL-specific +options for certificates etc. + +Note that using `FTPS://` as prefix is the "implicit" way as described in the +standards while the recommended "explicit" way is done by using FTP:// and the +`--ftp-ssl` option. + +### SFTP / SCP + +This is similar to FTP, but you can use the `--key` option to specify a +private key to use instead of a password. Note that the private key may itself +be protected by a password that is unrelated to the login password of the +remote system; this password is specified using the `--pass` option. +Typically, curl will automatically extract the public key from the private key +file, but in cases where curl does not have the proper library support, a +matching public key file must be specified using the `--pubkey` option. + +### HTTP + +Curl also supports user and password in HTTP URLs, thus you can pick a file +like: + + curl http://name:passwd@machine.domain/full/path/to/file + +or specify user and password separately like in + + curl -u name:passwd http://machine.domain/full/path/to/file + +HTTP offers many different methods of authentication and curl supports +several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which +method to use, curl defaults to Basic. You can also ask curl to pick the most +secure ones out of the ones that the server accepts for the given URL, by +using `--anyauth`. + +**Note**! According to the URL specification, HTTP URLs can not contain a user +and password, so that style will not work when using curl via a proxy, even +though curl allows it at other times. When using a proxy, you _must_ use the +`-u` style for user and password. + +### HTTPS + +Probably most commonly used with private certificates, as explained below. + +## Proxy + +curl supports both HTTP and SOCKS proxy servers, with optional authentication. +It does not have special support for FTP proxy servers since there are no +standards for those, but it can still be made to work with many of them. You +can also use both HTTP and SOCKS proxies to transfer files to and from FTP +servers. + +Get an ftp file using an HTTP proxy named my-proxy that uses port 888: + + curl -x my-proxy:888 ftp://ftp.leachsite.com/README + +Get a file from an HTTP server that requires user and password, using the +same proxy as above: + + curl -u user:passwd -x my-proxy:888 http://www.get.this/ + +Some proxies require special authentication. Specify by using -U as above: + + curl -U user:passwd -x my-proxy:888 http://www.get.this/ + +A comma-separated list of hosts and domains which do not use the proxy can be +specified as: + + curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/ + +If the proxy is specified with `--proxy1.0` instead of `--proxy` or `-x`, then +curl will use HTTP/1.0 instead of HTTP/1.1 for any `CONNECT` attempts. + +curl also supports SOCKS4 and SOCKS5 proxies with `--socks4` and `--socks5`. + +See also the environment variables Curl supports that offer further proxy +control. + +Most FTP proxy servers are set up to appear as a normal FTP server from the +client's perspective, with special commands to select the remote FTP server. +curl supports the `-u`, `-Q` and `--ftp-account` options that can be used to +set up transfers through many FTP proxies. For example, a file can be uploaded +to a remote FTP server using a Blue Coat FTP proxy with the options: + + curl -u "username@ftp.server Proxy-Username:Remote-Pass" + --ftp-account Proxy-Password --upload-file local-file + ftp://my-ftp.proxy.server:21/remote/upload/path/ + +See the manual for your FTP proxy to determine the form it expects to set up +transfers, and curl's `-v` option to see exactly what curl is sending. + +## Ranges + +HTTP 1.1 introduced byte-ranges. Using this, a client can request to get only +one or more subparts of a specified document. Curl supports this with the `-r` +flag. + +Get the first 100 bytes of a document: + + curl -r 0-99 http://www.get.this/ + +Get the last 500 bytes of a document: + + curl -r -500 http://www.get.this/ + +Curl also supports simple ranges for FTP files as well. Then you can only +specify start and stop position. + +Get the first 100 bytes of a document using FTP: + + curl -r 0-99 ftp://www.get.this/README + +## Uploading + +### FTP / FTPS / SFTP / SCP + +Upload all data on stdin to a specified server: + + curl -T - ftp://ftp.upload.com/myfile + +Upload data from a specified file, login with user and password: + + curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile + +Upload a local file to the remote site, and use the local file name at the +remote site too: + + curl -T uploadfile -u user:passwd ftp://ftp.upload.com/ + +Upload a local file to get appended to the remote file: + + curl -T localfile -a ftp://ftp.upload.com/remotefile + +Curl also supports ftp upload through a proxy, but only if the proxy is +configured to allow that kind of tunneling. If it does, you can run curl in a +fashion similar to: + + curl --proxytunnel -x proxy:port -T localfile ftp.upload.com + +### SMB / SMBS + + curl -T file.txt -u "domain\username:passwd" + smb://server.example.com/share/ + +### HTTP + +Upload all data on stdin to a specified HTTP site: + + curl -T - http://www.upload.com/myfile + +Note that the HTTP server must have been configured to accept PUT before this +can be done successfully. + +For other ways to do HTTP data upload, see the POST section below. + +## Verbose / Debug + +If curl fails where it isn't supposed to, if the servers don't let you in, if +you can't understand the responses: use the `-v` flag to get verbose +fetching. Curl will output lots of info and what it sends and receives in +order to let the user see all client-server interaction (but it won't show you +the actual data). + + curl -v ftp://ftp.upload.com/ + +To get even more details and information on what curl does, try using the +`--trace` or `--trace-ascii` options with a given file name to log to, like +this: + + curl --trace trace.txt www.haxx.se + + +## Detailed Information + +Different protocols provide different ways of getting detailed information +about specific files/documents. To get curl to show detailed information about +a single file, you should use `-I`/`--head` option. It displays all available +info on a single file for HTTP and FTP. The HTTP information is a lot more +extensive. + +For HTTP, you can get the header information (the same as `-I` would show) +shown before the data by using `-i`/`--include`. Curl understands the +`-D`/`--dump-header` option when getting files from both FTP and HTTP, and it +will then store the headers in the specified file. + +Store the HTTP headers in a separate file (headers.txt in the example): + + curl --dump-header headers.txt curl.haxx.se + +Note that headers stored in a separate file can be very useful at a later time +if you want curl to use cookies sent by the server. More about that in the +cookies section. + +## POST (HTTP) + +It's easy to post data using curl. This is done using the `-d ` option. +The post data must be urlencoded. + +Post a simple "name" and "phone" guestbook. + + curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi + +How to post a form with curl, lesson #1: + +Dig out all the `` tags in the form that you want to fill in. + +If there's a "normal" post, you use `-d` to post. `-d` takes a full "post +string", which is in the format + + =&=&... + +The 'variable' names are the names set with `"name="` in the `` tags, +and the data is the contents you want to fill in for the inputs. The data +*must* be properly URL encoded. That means you replace space with + and that +you replace weird letters with %XX where XX is the hexadecimal representation +of the letter's ASCII code. + +Example: + +(page located at `http://www.formpost.com/getthis/`) + +
+ + + + +
+ +We want to enter user 'foobar' with password '12345'. + +To post to this, you enter a curl command line like: + + curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" + http://www.formpost.com/getthis/post.cgi + +While `-d` uses the application/x-www-form-urlencoded mime-type, generally +understood by CGI's and similar, curl also supports the more capable +multipart/form-data type. This latter type supports things like file upload. + +`-F` accepts parameters like `-F "name=contents"`. If you want the contents to +be read from a file, use `@filename` as contents. When specifying a file, you +can also specify the file content type by appending `;type=` to the +file name. You can also post the contents of several files in one field. For +example, the field name 'coolfiles' is used to send three files, with +different content types using the following syntax: + + curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" + http://www.post.com/postit.cgi + +If the content-type is not specified, curl will try to guess from the file +extension (it only knows a few), or use the previously specified type (from an +earlier file if several files are specified in a list) or else it will use the +default type 'application/octet-stream'. + +Emulate a fill-in form with `-F`. Let's say you fill in three fields in a +form. One field is a file name which to post, one field is your name and one +field is a file description. We want to post the file we have written named +"cooltext.txt". To let curl do the posting of this data instead of your +favourite browser, you have to read the HTML source of the form page and find +the names of the input fields. In our example, the input field names are +'file', 'yourname' and 'filedescription'. + + curl -F "file=@cooltext.txt" -F "yourname=Daniel" + -F "filedescription=Cool text file with cool text inside" + http://www.post.com/postit.cgi + +To send two files in one post you can do it in two ways: + +Send multiple files in a single "field" with a single field name: + + curl -F "pictures=@dog.gif,cat.gif" $URL + +Send two fields with two field names + + curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL + +To send a field value literally without interpreting a leading `@` or `<`, or +an embedded `;type=`, use `--form-string` instead of `-F`. This is recommended +when the value is obtained from a user or some other unpredictable +source. Under these circumstances, using `-F` instead of `--form-string` could +allow a user to trick curl into uploading a file. + +## Referrer + +An HTTP request has the option to include information about which address +referred it to the actual page. Curl allows you to specify the referrer to be +used on the command line. It is especially useful to fool or trick stupid +servers or CGI scripts that rely on that information being available or +contain certain data. + + curl -e www.coolsite.com http://www.showme.com/ + +## User Agent + +An HTTP request has the option to include information about the browser that +generated the request. Curl allows it to be specified on the command line. It +is especially useful to fool or trick stupid servers or CGI scripts that only +accept certain browsers. + +Example: + + curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/ + +Other common strings: + +- `Mozilla/3.0 (Win95; I)` - Netscape Version 3 for Windows 95 +- `Mozilla/3.04 (Win95; U)` - Netscape Version 3 for Windows 95 +- `Mozilla/2.02 (OS/2; U)` - Netscape Version 2 for OS/2 +- `Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)` - Netscape for AIX +- `Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)` - Netscape for Linux + +Note that Internet Explorer tries hard to be compatible in every way: + +- `Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)` - MSIE for W95 + +Mozilla is not the only possible User-Agent name: + +- `Konqueror/1.0` - KDE File Manager desktop client +- `Lynx/2.7.1 libwww-FM/2.14` - Lynx command line browser + +## Cookies + +Cookies are generally used by web servers to keep state information at the +client's side. The server sets cookies by sending a response line in the +headers that looks like `Set-Cookie: ` where the data part then +typically contains a set of `NAME=VALUE` pairs (separated by semicolons `;` +like `NAME1=VALUE1; NAME2=VALUE2;`). The server can also specify for what path +the "cookie" should be used for (by specifying `path=value`), when the cookie +should expire (`expire=DATE`), for what domain to use it (`domain=NAME`) and +if it should be used on secure connections only (`secure`). + +If you've received a page from a server that contains a header like: + + Set-Cookie: sessionid=boo123; path="/foo"; + +it means the server wants that first pair passed on when we get anything in a +path beginning with "/foo". + +Example, get a page that wants my name passed in a cookie: + + curl -b "name=Daniel" www.sillypage.com + +Curl also has the ability to use previously received cookies in following +sessions. If you get cookies from a server and store them in a file in a +manner similar to: + + curl --dump-header headers www.example.com + +... you can then in a second connect to that (or another) site, use the +cookies from the 'headers' file like: + + curl -b headers www.example.com + +While saving headers to a file is a working way to store cookies, it is +however error-prone and not the preferred way to do this. Instead, make curl +save the incoming cookies using the well-known netscape cookie format like +this: + + curl -c cookies.txt www.example.com + +Note that by specifying `-b` you enable the "cookie awareness" and with `-L` +you can make curl follow a location: (which often is used in combination with +cookies). So that if a site sends cookies and a location, you can use a +non-existing file to trigger the cookie awareness like: + + curl -L -b empty.txt www.example.com + +The file to read cookies from must be formatted using plain HTTP headers OR as +netscape's cookie file. Curl will determine what kind it is based on the file +contents. In the above command, curl will parse the header and store the +cookies received from www.example.com. curl will send to the server the +stored cookies which match the request as it follows the location. The file +"empty.txt" may be a nonexistent file. + +To read and write cookies from a netscape cookie file, you can set both `-b` +and `-c` to use the same file: + + curl -b cookies.txt -c cookies.txt www.example.com + +## Progress Meter + +The progress meter exists to show a user that something actually is +happening. The different fields in the output have the following meaning: + + % Total % Received % Xferd Average Speed Time Curr. + Dload Upload Total Current Left Speed + 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287 + +From left-to-right: + + - % - percentage completed of the whole transfer + - Total - total size of the whole expected transfer + - % - percentage completed of the download + - Received - currently downloaded amount of bytes + - % - percentage completed of the upload + - Xferd - currently uploaded amount of bytes + - Average Speed Dload - the average transfer speed of the download + - Average Speed Upload - the average transfer speed of the upload + - Time Total - expected time to complete the operation + - Time Current - time passed since the invoke + - Time Left - expected time left to completion + - Curr.Speed - the average transfer speed the last 5 seconds (the first + 5 seconds of a transfer is based on less time of course.) + +The `-#` option will display a totally different progress bar that doesn't +need much explanation! + +## Speed Limit + +Curl allows the user to set the transfer speed conditions that must be met to +let the transfer keep going. By using the switch `-y` and `-Y` you can make +curl abort transfers if the transfer speed is below the specified lowest limit +for a specified time. + +To have curl abort the download if the speed is slower than 3000 bytes per +second for 1 minute, run: + + curl -Y 3000 -y 60 www.far-away-site.com + +This can very well be used in combination with the overall time limit, so +that the above operation must be completed in whole within 30 minutes: + + curl -m 1800 -Y 3000 -y 60 www.far-away-site.com + +Forcing curl not to transfer data faster than a given rate is also possible, +which might be useful if you're using a limited bandwidth connection and you +don't want your transfer to use all of it (sometimes referred to as +"bandwidth throttle"). + +Make curl transfer data no faster than 10 kilobytes per second: + + curl --limit-rate 10K www.far-away-site.com + +or + + curl --limit-rate 10240 www.far-away-site.com + +Or prevent curl from uploading data faster than 1 megabyte per second: + + curl -T upload --limit-rate 1M ftp://uploadshereplease.com + +When using the `--limit-rate` option, the transfer rate is regulated on a +per-second basis, which will cause the total transfer speed to become lower +than the given number. Sometimes of course substantially lower, if your +transfer stalls during periods. + +## Config File + +Curl automatically tries to read the `.curlrc` file (or `_curlrc` file on +Microsoft Windows systems) from the user's home dir on startup. + +The config file could be made up with normal command line switches, but you +can also specify the long options without the dashes to make it more +readable. You can separate the options and the parameter with spaces, or with +`=` or `:`. Comments can be used within the file. If the first letter on a +line is a `#`-symbol the rest of the line is treated as a comment. + +If you want the parameter to contain spaces, you must enclose the entire +parameter within double quotes (`"`). Within those quotes, you specify a quote +as `\"`. + +NOTE: You must specify options and their arguments on the same line. + +Example, set default time out and proxy in a config file: + + # We want a 30 minute timeout: + -m 1800 + # ... and we use a proxy for all accesses: + proxy = proxy.our.domain.com:8080 + +White spaces ARE significant at the end of lines, but all white spaces leading +up to the first characters of each line are ignored. + +Prevent curl from reading the default file by using -q as the first command +line parameter, like: + + curl -q www.thatsite.com + +Force curl to get and display a local help page in case it is invoked without +URL by making a config file similar to: + + # default url to get + url = "http://help.with.curl.com/curlhelp.html" + +You can specify another config file to be read by using the `-K`/`--config` +flag. If you set config file name to `-` it'll read the config from stdin, +which can be handy if you want to hide options from being visible in process +tables etc: + + echo "user = user:passwd" | curl -K - http://that.secret.site.com + +## Extra Headers + +When using curl in your own very special programs, you may end up needing +to pass on your own custom headers when getting a web page. You can do +this by using the `-H` flag. + +Example, send the header `X-you-and-me: yes` to the server when getting a +page: + + curl -H "X-you-and-me: yes" www.love.com + +This can also be useful in case you want curl to send a different text in a +header than it normally does. The `-H` header you specify then replaces the +header curl would normally send. If you replace an internal header with an +empty one, you prevent that header from being sent. To prevent the `Host:` +header from being used: + + curl -H "Host:" www.server.com + +## FTP and Path Names + +Do note that when getting files with a `ftp://` URL, the given path is +relative the directory you enter. To get the file `README` from your home +directory at your ftp site, do: + + curl ftp://user:passwd@my.site.com/README + +But if you want the README file from the root directory of that very same +site, you need to specify the absolute file name: + + curl ftp://user:passwd@my.site.com//README + +(I.e with an extra slash in front of the file name.) + +## SFTP and SCP and Path Names + +With sftp: and scp: URLs, the path name given is the absolute name on the +server. To access a file relative to the remote user's home directory, prefix +the file with `/~/` , such as: + + curl -u $USER sftp://home.example.com/~/.bashrc + +## FTP and Firewalls + +The FTP protocol requires one of the involved parties to open a second +connection as soon as data is about to get transferred. There are two ways to +do this. + +The default way for curl is to issue the PASV command which causes the server +to open another port and await another connection performed by the +client. This is good if the client is behind a firewall that doesn't allow +incoming connections. + + curl ftp.download.com + +If the server, for example, is behind a firewall that doesn't allow +connections on ports other than 21 (or if it just doesn't support the `PASV` +command), the other way to do it is to use the `PORT` command and instruct the +server to connect to the client on the given IP number and port (as parameters +to the PORT command). + +The `-P` flag to curl supports a few different options. Your machine may have +several IP-addresses and/or network interfaces and curl allows you to select +which of them to use. Default address can also be used: + + curl -P - ftp.download.com + +Download with `PORT` but use the IP address of our `le0` interface (this does +not work on windows): + + curl -P le0 ftp.download.com + +Download with `PORT` but use 192.168.0.10 as our IP address to use: + + curl -P 192.168.0.10 ftp.download.com + +## Network Interface + +Get a web page from a server using a specified port for the interface: + + curl --interface eth0:1 http://www.netscape.com/ + +or + + curl --interface 192.168.1.10 http://www.netscape.com/ + +## HTTPS + +Secure HTTP requires a TLS library to be installed and used when curl is +built. If that is done, curl is capable of retrieving and posting documents +using the HTTPS protocol. + +Example: + + curl https://www.secure-site.com + +curl is also capable of using client certificates to get/post files from sites +that require valid certificates. The only drawback is that the certificate +needs to be in PEM-format. PEM is a standard and open format to store +certificates with, but it is not used by the most commonly used browsers. If +you want curl to use the certificates you use with your (favourite) browser, +you may need to download/compile a converter that can convert your browser's +formatted certificates to PEM formatted ones. + +Example on how to automatically retrieve a document using a certificate with a +personal password: + + curl -E /path/to/cert.pem:password https://secure.site.com/ + +If you neglect to specify the password on the command line, you will be +prompted for the correct password before any data can be received. + +Many older HTTPS servers have problems with specific SSL or TLS versions, +which newer versions of OpenSSL etc use, therefore it is sometimes useful to +specify what SSL-version curl should use. Use -3, -2 or -1 to specify that +exact SSL version to use (for SSLv3, SSLv2 or TLSv1 respectively): + + curl -2 https://secure.site.com/ + +Otherwise, curl will attempt to use a sensible TLS default version. + +## Resuming File Transfers + +To continue a file transfer where it was previously aborted, curl supports +resume on HTTP(S) downloads as well as FTP uploads and downloads. + +Continue downloading a document: + + curl -C - -o file ftp://ftp.server.com/path/file + +Continue uploading a document: + + curl -C - -T file ftp://ftp.server.com/path/file + +Continue downloading a document from a web server + + curl -C - -o file http://www.server.com/ + +## Time Conditions + +HTTP allows a client to specify a time condition for the document it requests. +It is `If-Modified-Since` or `If-Unmodified-Since`. curl allows you to specify +them with the `-z`/`--time-cond` flag. + +For example, you can easily make a download that only gets performed if the +remote file is newer than a local copy. It would be made like: + + curl -z local.html http://remote.server.com/remote.html + +Or you can download a file only if the local file is newer than the remote +one. Do this by prepending the date string with a `-`, as in: + + curl -z -local.html http://remote.server.com/remote.html + +You can specify a "free text" date as condition. Tell curl to only download +the file if it was updated since January 12, 2012: + + curl -z "Jan 12 2012" http://remote.server.com/remote.html + +Curl will then accept a wide range of date formats. You always make the date +check the other way around by prepending it with a dash (`-`). + +## DICT + +For fun try + + curl dict://dict.org/m:curl + curl dict://dict.org/d:heisenbug:jargon + curl dict://dict.org/d:daniel:gcide + +Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define' and +'lookup'. For example, + + curl dict://dict.org/find:curl + +Commands that break the URL description of the RFC (but not the DICT +protocol) are + + curl dict://dict.org/show:db + curl dict://dict.org/show:strat + +Authentication support is still missing + +## LDAP + +If you have installed the OpenLDAP library, curl can take advantage of it and +offer `ldap://` support. On Windows, curl will use WinLDAP from Platform SDK +by default. + +Default protocol version used by curl is LDAPv3. LDAPv2 will be used as +fallback mechanism in case if LDAPv3 will fail to connect. + +LDAP is a complex thing and writing an LDAP query is not an easy task. I do +advise you to dig up the syntax description for that elsewhere. One such place +might be: [RFC 2255, The LDAP URL +Format](https://curl.haxx.se/rfc/rfc2255.txt) + +To show you an example, this is how I can get all people from my local LDAP +server that has a certain sub-domain in their email address: + + curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se" + +If I want the same info in HTML format, I can get it by not using the `-B` +(enforce ASCII) flag. + +You also can use authentication when accessing LDAP catalog: + + curl -u user:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*" + curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*" + +By default, if user and password provided, OpenLDAP/WinLDAP will use basic +authentication. On Windows you can control this behavior by providing one of +`--basic`, `--ntlm` or `--digest` option in curl command line + + curl --ntlm "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*" + +On Windows, if no user/password specified, auto-negotiation mechanism will be +used with current logon credentials (SSPI/SPNEGO). + +## Environment Variables + +Curl reads and understands the following environment variables: + + http_proxy, HTTPS_PROXY, FTP_PROXY + +They should be set for protocol-specific proxies. General proxy should be set +with + + ALL_PROXY + +A comma-separated list of host names that shouldn't go through any proxy is +set in (only an asterisk, `*` matches all hosts) + + NO_PROXY + +If the host name matches one of these strings, or the host is within the +domain of one of these strings, transactions with that node will not be +proxied. When a domain is used, it needs to start with a period. A user can +specify that both www.example.com and foo.example.com should not use a proxy +by setting `NO_PROXY` to `.example.com`. By including the full name you can +exclude specific host names, so to make `www.example.com` not use a proxy but +still have `foo.example.com` do it, set `NO_PROXY` to `www.example.com`. + +The usage of the `-x`/`--proxy` flag overrides the environment variables. + +## Netrc + +Unix introduced the `.netrc` concept a long time ago. It is a way for a user +to specify name and password for commonly visited FTP sites in a file so that +you don't have to type them in each time you visit those sites. You realize +this is a big security risk if someone else gets hold of your passwords, so +therefore most unix programs won't read this file unless it is only readable +by yourself (curl doesn't care though). + +Curl supports `.netrc` files if told to (using the `-n`/`--netrc` and +`--netrc-optional` options). This is not restricted to just FTP, so curl can +use it for all protocols where authentication is used. + +A very simple `.netrc` file could look something like: + + machine curl.haxx.se login iamdaniel password mysecret + +## Custom Output + +To better allow script programmers to get to know about the progress of curl, +the `-w`/`--write-out` option was introduced. Using this, you can specify what +information from the previous transfer you want to extract. + +To display the amount of bytes downloaded together with some text and an +ending newline: + + curl -w 'We downloaded %{size_download} bytes\n' www.download.com + +## Kerberos FTP Transfer + +Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need the +kerberos package installed and used at curl build time for it to be available. + +First, get the krb-ticket the normal way, like with the kinit/kauth tool. +Then use curl in way similar to: + + curl --krb private ftp://krb4site.com -u username:fakepwd + +There's no use for a password on the `-u` switch, but a blank one will make +curl ask for one and you already entered the real password to kinit/kauth. + +## TELNET + +The curl telnet support is basic and very easy to use. Curl passes all data +passed to it on stdin to the remote server. Connect to a remote telnet server +using a command line similar to: + + curl telnet://remote.server.com + +And enter the data to pass to the server on stdin. The result will be sent to +stdout or to the file you specify with `-o`. + +You might want the `-N`/`--no-buffer` option to switch off the buffered output +for slow connections or similar. + +Pass options to the telnet protocol negotiation, by using the `-t` option. To +tell the server we use a vt100 terminal, try something like: + + curl -tTTYPE=vt100 telnet://remote.server.com + +Other interesting options for it `-t` include: + + - `XDISPLOC=` Sets the X display location. + - `NEW_ENV=` Sets an environment variable. + +NOTE: The telnet protocol does not specify any way to login with a specified +user and password so curl can't do that automatically. To do that, you need to +track when the login prompt is received and send the username and password +accordingly. + +## Persistent Connections + +Specifying multiple files on a single command line will make curl transfer all +of them, one after the other in the specified order. + +libcurl will attempt to use persistent connections for the transfers so that +the second transfer to the same host can use the same connection that was +already initiated and was left open in the previous transfer. This greatly +decreases connection time for all but the first transfer and it makes a far +better use of the network. + +Note that curl cannot use persistent connections for transfers that are used +in subsequence curl invokes. Try to stuff as many URLs as possible on the same +command line if they are using the same host, as that'll make the transfers +faster. If you use an HTTP proxy for file transfers, practically all transfers +will be persistent. + +## Multiple Transfers With A Single Command Line + +As is mentioned above, you can download multiple files with one command line +by simply adding more URLs. If you want those to get saved to a local file +instead of just printed to stdout, you need to add one save option for each +URL you specify. Note that this also goes for the `-O` option (but not +`--remote-name-all`). + +For example: get two files and use `-O` for the first and a custom file +name for the second: + + curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg + +You can also upload multiple files in a similar fashion: + + curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt + +## IPv6 + +curl will connect to a server with IPv6 when a host lookup returns an IPv6 +address and fall back to IPv4 if the connection fails. The `--ipv4` and +`--ipv6` options can specify which address to use when both are +available. IPv6 addresses can also be specified directly in URLs using the +syntax: + + http://[2001:1890:1112:1::20]/overview.html + +When this style is used, the `-g` option must be given to stop curl from +interpreting the square brackets as special globbing characters. Link local +and site local addresses including a scope identifier, such as `fe80::1234%1`, +may also be used, but the scope portion must be numeric or match an existing +network interface on Linux and the percent character must be URL escaped. The +previous example in an SFTP URL might look like: + + sftp://[fe80::1234%251]/ + +IPv6 addresses provided other than in URLs (e.g. to the `--proxy`, +`--interface` or `--ftp-port` options) should not be URL encoded. + +## Metalink + +Curl supports Metalink (both version 3 and 4 (RFC 5854) are supported), a way +to list multiple URIs and hashes for a file. Curl will make use of the mirrors +listed within for failover if there are errors (such as the file or server not +being available). It will also verify the hash of the file after the download +completes. The Metalink file itself is downloaded and processed in memory and +not stored in the local file system. + +Example to use a remote Metalink file: + + curl --metalink http://www.example.com/example.metalink + +To use a Metalink file in the local file system, use FILE protocol +(`file://`): + + curl --metalink file://example.metalink + +Please note that if FILE protocol is disabled, there is no way to use a local +Metalink file at the time of this writing. Also note that if `--metalink` and +`--include` are used together, `--include` will be ignored. This is because +including headers in the response will break Metalink parser and if the +headers are included in the file described in Metalink file, hash check will +fail. + +## Mailing Lists + +For your convenience, we have several open mailing lists to discuss curl, its +development and things relevant to this. Get all info at +https://curl.haxx.se/mail/. + +Please direct curl questions, feature requests and trouble reports to one of +these mailing lists instead of mailing any individual. + +Available lists include: + +### curl-users + +Users of the command line tool. How to use it, what doesn't work, new +features, related tools, questions, news, installations, compilations, +running, porting etc. + +### curl-library + +Developers using or developing libcurl. Bugs, extensions, improvements. + +### curl-announce + +Low-traffic. Only receives announcements of new public versions. At worst, +that makes something like one or two mails per month, but usually only one +mail every second month. + +### curl-and-php + +Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP with +a curl angle. + +### curl-and-python + +Python hackers using curl with or without the python binding pycurl. + diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000000..5ce0d83975 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,124 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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 + +# EXTRA_DIST breaks with $(abs_builddir) so build it using this variable +# but distribute it (using the relative file name) in the next variable +man_MANS = $(abs_builddir)/curl.1 +noinst_man_MANS = curl.1 mk-ca-bundle.1 +dist_man_MANS = curl-config.1 +GENHTMLPAGES = curl.html curl-config.html mk-ca-bundle.html +PDFPAGES = curl.pdf curl-config.pdf mk-ca-bundle.pdf +MANDISTPAGES = curl.1.dist curl-config.1.dist + +HTMLPAGES = $(GENHTMLPAGES) index.html + +# Build targets in this file (.) before cmdline-opts to ensure that +# the curl.1 rule below runs first +SUBDIRS = . cmdline-opts +DIST_SUBDIRS = $(SUBDIRS) examples libcurl + +CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) $(MANDISTPAGES) curl.1 + +EXTRA_DIST = \ + $(noinst_man_MANS) \ + ALTSVC.md \ + BINDINGS.md \ + BUG-BOUNTY.md \ + BUGS \ + CHECKSRC.md \ + CIPHERS.md \ + CMakeLists.txt \ + CODE_OF_CONDUCT.md \ + CODE_STYLE.md \ + CONTRIBUTE.md \ + CURL-DISABLE.md \ + DEPRECATE.md \ + ESNI.md \ + EXPERIMENTAL.md \ + FAQ \ + FEATURES \ + GOVERNANCE.md \ + HELP-US.md \ + HISTORY.md \ + HTTP-COOKIES.md \ + HTTP2.md \ + HTTP3.md \ + INSTALL \ + INSTALL.cmake \ + INSTALL.md \ + INTERNALS.md \ + KNOWN_BUGS \ + LICENSE-MIXING.md \ + MAIL-ETIQUETTE \ + PARALLEL-TRANSFERS.md \ + README.cmake \ + README.md \ + README.netware \ + README.win32 \ + RELEASE-PROCEDURE.md \ + RESOURCES \ + ROADMAP.md \ + SECURITY-PROCESS.md \ + SSL-PROBLEMS.md \ + SSLCERTS.md \ + THANKS \ + TODO \ + TheArtOfHttpScripting \ + VERSIONS + +MAN2HTML= roffit $< >$@ + +SUFFIXES = .1 .html .pdf + +# $(abs_builddir) is to disable VPATH when searching for this file, which +# would otherwise find the copy in $(srcdir) which breaks the $(HUGE) +# rule in src/Makefile.am in out-of-tree builds that references the file in the +# build directory. +# +# First, seed the used copy of curl.1 with the prebuilt copy (in an out-of-tree +# build), then run make recursively to rebuild it only if its dependencies +# have changed. +$(abs_builddir)/curl.1: + if test "$(top_builddir)x" != "$(top_srcdir)x" -a -e "$(srcdir)/curl.1"; then \ + $(INSTALL_DATA) "$(srcdir)/curl.1" $@; fi + cd cmdline-opts && $(MAKE) + +html: $(HTMLPAGES) + cd libcurl && $(MAKE) html + +pdf: $(PDFPAGES) + cd libcurl && $(MAKE) pdf + +.1.html: + $(MAN2HTML) + +.1.pdf: + @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ + groff -Tps -man $< >$$foo.ps; \ + ps2pdf $$foo.ps $@; \ + rm $$foo.ps; \ + echo "converted $< to $@") + +distclean: + rm -f $(CLEANFILES) diff --git a/docs/PARALLEL-TRANSFERS.md b/docs/PARALLEL-TRANSFERS.md new file mode 100644 index 0000000000..da688ea050 --- /dev/null +++ b/docs/PARALLEL-TRANSFERS.md @@ -0,0 +1,58 @@ +# Parallel transfers + +curl 7.66.0 introduces support for doing multiple transfers simultaneously; in +parallel. + +## -Z, --parallel + +When this command line option is used, curl will perform the transfers given +to it at the same time. It will do up to `--parallel-max` concurrent +transfers, with a default value of 50. + +## Progress meter + +The progress meter that is displayed when doing parallel transfers is +completely different than the regular one used for each single transfer. + + It shows: + + o percent download (if known, which means *all* transfers need to have a + known size) + o percent upload (if known, with the same caveat as for download) + o total amount of downloaded data + o total amount of uploaded data + o number of transfers to perform + o number of concurrent transfers being transferred right now + o number of transfers queued up waiting to start + o total time all transfers are expected to take (if sizes are known) + o current time the transfers have spent so far + o estimated time left (if sizes are known) + o current transfer speed (the faster of UL/DL speeds measured over the last + few seconds) + +Example: + + DL% UL% Dled Uled Xfers Live Qd Total Current Left Speed + 72 -- 37.9G 0 101 30 23 0:00:55 0:00:34 0:00:22 2752M + +## Behavior differences + +Connections are shared fine between different easy handles, but the +"authentication contexts" are not. So for example doing HTTP Digest auth with +one handle for a particular transfer and then continue on with another handle +that reuses the same connection, the second handle can't send the necessary +Authorization header at once since the context is only kept in the original +easy handle. + +To fix this, the authorization state could be made possible to share with the +share API as well, as a context per origin + path (realm?) basically. + +Visible in test 153, 1412 and more. + +## Feedback! + +This is early days for parallel transfer support. Keep your eyes open for +unintended side effects or downright bugs. + +Tell us what you think and how you think we could improve this feature! + diff --git a/docs/README.cmake b/docs/README.cmake new file mode 100644 index 0000000000..084c1de6d5 --- /dev/null +++ b/docs/README.cmake @@ -0,0 +1,16 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README.cmake + Read the README file first. + + Curl contains CMake build files that provide a way to build Curl with the + CMake build tool (www.cmake.org). CMake is a cross platform meta build tool + that generates native makefiles and IDE project files. The CMake build + system can be used to build Curl on any of its supported platforms. + + Read the INSTALL.cmake file for instructions on how to compile curl with + CMake. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..6ee42aad33 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,12 @@ +![curl logo](https://curl.haxx.se/logo/curl-logo.svg) + +# Documentation + +You'll find a mix of various documentation in this directory and +subdirectories, using several different formats. Some of them are not ideal +for reading directly in your browser. + +If you'd rather see the rendered version of the documentation, check out the +curl web site's [documentation section](https://curl.haxx.se/docs/) for +general curl stuff or the [libcurl section](https://curl.haxx.se/libcurl/) for +libcurl related documentation. diff --git a/docs/README.netware b/docs/README.netware new file mode 100644 index 0000000000..e6e1e0002e --- /dev/null +++ b/docs/README.netware @@ -0,0 +1,24 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README.netware + + Read the README file first. + + Curl has been successfully compiled with gcc / nlmconv on different flavours + of Linux as well as with the official Metrowerks CodeWarrior compiler. + While not being the main development target, a continuously growing share of + curl users are NetWare-based, especially also consuming the lib from PHP. + + The unix-style man pages are tricky to read on windows, so therefore all + those pages are also provided as web pages on the curl web site. + + The main curl.1 man page is also "built-in" in the command line tool. Use a + command line similar to this in order to extract a separate text file: + + curl -M >manual.txt + + Read the INSTALL file for instructions on how to compile curl self. diff --git a/docs/README.win32 b/docs/README.win32 new file mode 100644 index 0000000000..ca34dd1625 --- /dev/null +++ b/docs/README.win32 @@ -0,0 +1,23 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README.win32 + + Read the README file first. + + Curl has been compiled, built and run on all sorts of Windows and win32 + systems. While not being the main develop target, a fair share of curl users + are win32-based. + + The unix-style man pages are tricky to read on windows, so therefore all + those pages are also provided as web pages on the curl web site. + + The main curl.1 man page is also "built-in" in the command line tool. Use a + command line similar to this in order to extract a separate text file: + + curl -M >manual.txt + + Read the INSTALL file for instructions on how to compile curl self. diff --git a/docs/RELEASE-PROCEDURE.md b/docs/RELEASE-PROCEDURE.md new file mode 100644 index 0000000000..f2b4343bdd --- /dev/null +++ b/docs/RELEASE-PROCEDURE.md @@ -0,0 +1,106 @@ +curl release procedure - how to do a release +============================================ + +in the source code repo +----------------------- + +- edit `RELEASE-NOTES` to be accurate + +- update `docs/THANKS` + +- make sure all relevant changes are committed on the master branch + +- tag the git repo in this style: `git tag -a curl-7_34_0`. -a annotates the + tag and we use underscores instead of dots in the version number. Make sure + the tag is GPG signed (using -s). + +- run "./maketgz 7.34.0" to build the release tarballs. It is important that + you run this on a machine with the correct set of autotools etc installed + as this is what then will be shipped and used by most users on \*nix like + systems. + +- push the git commits and the new tag + +- gpg sign the 4 tarballs as maketgz suggests + +- upload the 8 resulting files to the primary download directory + +in the curl-www repo +-------------------- + +- edit `Makefile` (version number and date), + +- edit `_newslog.html` (announce the new release) and + +- edit `_changes.html` (insert changes+bugfixes from RELEASE-NOTES) + +- commit all local changes + +- tag the repo with the same name as used for the source repo. + +- make sure all relevant changes are committed and pushed on the master branch + + (the web site then updates its contents automatically) + +on github +--------- + +- edit the newly made release tag so that it is listed as the latest release + +inform +------ + +- send an email to curl-users, curl-announce and curl-library. Insert the + RELEASE-NOTES into the mail. + +celebrate +--------- + +- suitable beverage intake is encouraged for the festivities + +curl release scheduling +======================= + +Release Cycle +------------- + +We do releases every 8 weeks on Wednesdays. If critical problems arise, we can +insert releases outside of the schedule or we can move the release date - but +this is rare. + +Each 8 week release cycle is split in two 4-week periods. + +- During the first 4 weeks after a release, we allow new features and changes + to curl and libcurl. If we accept any such changes, we bump the minor number + used for the next release. + +- During the second 4-week period we do not merge any features or changes, we + then only focus on fixing bugs and polishing things to make a solid coming + release. + +- After a regular procedure-following release (made on Wednesdays), the + feature window remains closed until the following Monday in case of special + actions or patch releases etc. + +If a future release date happens to end up on a "bad date", like in the middle +of common public holidays or when the lead release manager is away traveling, +the release date can be moved forwards or backwards a full week. This is then +advertised well in advance. + +Coming dates +------------ + +Based on the description above, here are some planned release dates (at the +time of this writing): + +- March 4, 2020 (7.69.0) +- April 29, 2020 +- June 24, 2020 +- August 19, 2020 +- October 14, 2020 +- December 9, 2020 +- February 3, 2021 + +The above (and more) curl-related dates are published in +[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics) +as well. diff --git a/docs/RESOURCES b/docs/RESOURCES new file mode 100644 index 0000000000..55f75df770 --- /dev/null +++ b/docs/RESOURCES @@ -0,0 +1,85 @@ + _ _ ____ _ + Project ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +This document lists documents and standards used by curl. + + RFC 959 - FTP Protocol + + RFC 1635 - How to Use Anonymous FTP + + RFC 1738 - Uniform Resource Locators + + RFC 1777 - Lightweight Directory Access Protocol (LDAP) + + RFC 1808 - Relative Uniform Resource Locators + + RFC 1867 - Form-based File Upload in HTML + + RFC 1950 - ZLIB Compressed Data Format Specification + + RFC 1951 - DEFLATE Compressed Data Format Specification + + RFC 1952 - GZIP File Format Specification + + RFC 1959 - LDAP URL Syntax + + RFC 2045-2049 - Everything you need to know about MIME! (needed for form + based upload) + + RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616) + + RFC 2104 - Keyed-Hashing for Message Authentication + + RFC 2109 - HTTP State Management Mechanism (cookie stuff) + - Also, read Netscape's specification at + https://curl.haxx.se/rfc/cookie_spec.html + + RFC 2183 - The Content-Disposition Header Field + + RFC 2195 - CRAM-MD5 Authentication + + RFC 2229 - A Dictionary Server Protocol + + RFC 2255 - Newer LDAP URL Format + + RFC 2231 - MIME Parameter Value and Encoded Word Extensions: + Character Sets, Languages, and Continuations + + RFC 2388 - "Returning Values from Forms: multipart/form-data" + Use this as an addition to the RFC1867 + + RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This + one obsoletes RFC 1738, but since RFC 1738 is often mentioned + I've left it in this list. + + RFC 2428 - FTP Extensions for IPv6 and NATs + + RFC 2577 - FTP Security Considerations + + RFC 2616 - HTTP 1.1, the latest + + RFC 2617 - HTTP Authentication + + RFC 2718 - Guidelines for new URL Schemes + + RFC 2732 - Format for Literal IPv6 Addresses in URL's + + RFC 2818 - HTTP Over TLS (TLS is the successor to SSL) + + RFC 2821 - Simple Mail Transfer Protocol (SMTP) + + RFC 2964 - Use of HTTP State Management + + RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109 + + RFC 3207 - SMTP Over TLS + + RFC 4616 - PLAIN Authentication + + RFC 4954 - SMTP Authentication + + RFC 7932 - Brotli Compressed Data Format diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md new file mode 100644 index 0000000000..7bd07196ff --- /dev/null +++ b/docs/ROADMAP.md @@ -0,0 +1,63 @@ +curl the next few years - perhaps +================================= + +Roadmap of things Daniel Stenberg wants to work on next. It is intended to +serve as a guideline for others for information, feedback and possible +participation. + +HSTS +---- + + Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682). + + Loading a huge preload file is probably not too interesting to most people, + but using a custom file and reacting to HSTS response header probably are + good features. + +DNS-over-TLS +------------ + + Similar to DNS-over-HTTPS. Could share quite a lot of generic code. + +ESNI (Encrypted SNI) +-------------------- + + See Daniel's post on [Support of Encrypted + SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list. + + Initial work exists in https://github.com/curl/curl/pull/4011 + +thread-safe `curl_global_init()` +-------------------------------- + + Fix the libcurl specific parts of the function to be thread-safe. Make sure + it can be thread-safe if built with thread-safe 3rd party libraries. + (probably can't include `curl_global_init_mem()` for obvious reasons) + +tiny-curl +--------- + + There's no immediate action for this but users seem keen on being able to + building custom minimized versions of libcurl for their products. Make sure + new features that are "niche" can still be disabled at build-time. + +MQTT +---- + + Support receiving and sending MQTT messages. Initial work exists in + https://github.com/curl/curl/pull/3514 + +Hardcode “localhost†+-------------------- + + No need to resolve it. Avoid a risk where this is resolved over the network + and actually responds with something else than a local address. Some + operating systems already do this. Also: + https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02 + +"menu config"-style build feature selection +------------------------------------------- + + Allow easier building of custom libcurl versions with only a selected feature + where the available features are easily browsable and toggle-able ON/OFF or + similar. diff --git a/docs/SECURITY-PROCESS.md b/docs/SECURITY-PROCESS.md new file mode 100644 index 0000000000..e844a9a90f --- /dev/null +++ b/docs/SECURITY-PROCESS.md @@ -0,0 +1,132 @@ +curl security process +===================== + +This document describes how security vulnerabilities should be handled in the +curl project. + +Publishing Information +---------------------- + +All known and public curl or libcurl related vulnerabilities are listed on +[the curl web site security page](https://curl.haxx.se/docs/security.html). + +Security vulnerabilities **should not** be entered in the project's public bug +tracker. + +Vulnerability Handling +---------------------- + +The typical process for handling a new security vulnerability is as follows. + +No information should be made public about a vulnerability until it is +formally announced at the end of this process. That means, for example that a +bug tracker entry must NOT be created to track the issue since that will make +the issue public and it should not be discussed on any of the project's public +mailing lists. Also messages associated with any commits should not make any +reference to the security nature of the commit if done prior to the public +announcement. + +- The person discovering the issue, the reporter, reports the vulnerability on + [https://hackerone.com/curl](https://hackerone.com/curl). Issues filed there + reach a handful of selected and trusted people. + +- Messages that do not relate to the reporting or managing of an undisclosed + security vulnerability in curl or libcurl are ignored and no further action + is required. + +- A person in the security team responds to the original report to acknowledge + that a human has seen the report. + +- The security team investigates the report and either rejects it or accepts + it. + +- If the report is rejected, the team writes to the reporter to explain why. + +- If the report is accepted, the team writes to the reporter to let him/her + know it is accepted and that they are working on a fix. + +- The security team discusses the problem, works out a fix, considers the + impact of the problem and suggests a release schedule. This discussion + should involve the reporter as much as possible. + +- The release of the information should be "as soon as possible" and is most + often synchronized with an upcoming release that contains the fix. If the + reporter, or anyone else involved, thinks the next planned release is too + far away, then a separate earlier release should be considered. + +- Write a security advisory draft about the problem that explains what the + problem is, its impact, which versions it affects, solutions or workarounds, + when the release is out and make sure to credit all contributors properly. + Figure out the CWE (Common Weakness Enumeration) number for the flaw. + +- Request a CVE number from + [HackerOne](https://docs.hackerone.com/programs/cve-requests.html) + +- Consider informing + [distros@openwall](https://oss-security.openwall.org/wiki/mailing-lists/distros) + to prepare them about the upcoming public security vulnerability + announcement - attach the advisory draft for information. Note that + 'distros' won't accept an embargo longer than 14 days and they do not care + for Windows-specific flaws. + +- Update the "security advisory" with the CVE number. + +- The security team commits the fix in a private branch. The commit message + should ideally contain the CVE number. This fix is usually also distributed + to the 'distros' mailing list to allow them to use the fix prior to the + public announcement. + +- No more than 48 hours before the release, the private branch is merged into + the master branch and pushed. Once pushed, the information is accessible to + the public and the actual release should follow suit immediately afterwards. + The time between the push and the release is used for final tests and + reviews. + +- The project team creates a release that includes the fix. + +- The project team announces the release and the vulnerability to the world in + the same manner we always announce releases. It gets sent to the + curl-announce, curl-library and curl-users mailing lists. + +- The security web page on the web site should get the new vulnerability + mentioned. + +curl-security (at haxx dot se) +------------------------------ + +This is a private mailing list for discussions on and about curl security +issues. + +Who is on this list? There are a couple of criteria you must meet, and then we +might ask you to join the list or you can ask to join it. It really isn't very +formal. We basically only require that you have a long-term presence in the +curl project and you have shown an understanding for the project and its way +of working. You must've been around for a good while and you should have no +plans in vanishing in the near future. + +We do not make the list of participants public mostly because it tends to vary +somewhat over time and a list somewhere will only risk getting outdated. + +Publishing Security Advisories +------------------------------ + +1. Write up the security advisory, using markdown syntax. Use the same + subtitles as last time to maintain consistency. + +2. Name the advisory file after the allocated CVE id. + +3. Add a line on the top of the array in `curl-www/docs/vuln.pm'. + +4. Put the new advisory markdown file in the curl-www/docs/ directory. Add it + to the git repo. + +5. Run `make` in your local web checkout and verify that things look fine. + +6. On security advisory release day, push the changes on the curl-www + repository's remote master branch. + +Bug Bounty +---------- + +See [BUG-BOUNTY](https://curl.haxx.se/docs/bugbounty.html) for details on the +bug bounty program. diff --git a/docs/SSL-PROBLEMS.md b/docs/SSL-PROBLEMS.md new file mode 100644 index 0000000000..aaf7bdb594 --- /dev/null +++ b/docs/SSL-PROBLEMS.md @@ -0,0 +1,87 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +# SSL problems + + First, let's establish that we often refer to TLS and SSL interchangeably as + SSL here. The current protocol is called TLS, it was called SSL a long time + ago. + + There are several known reasons why a connection that involves SSL might + fail. This is a document that attempts to details the most common ones and + how to mitigate them. + +## CA certs + + CA certs are used to digitally verify the server's certificate. You need a + "ca bundle" for this. See lots of more details on this in the SSLCERTS + document. + +## CA bundle missing intermediate certificates + + When using said CA bundle to verify a server cert, you will experience + problems if your CA cert does not have the certificates for the + intermediates in the whole trust chain. + +## Protocol version + + Some broken servers fail to support the protocol negotiation properly that + SSL servers are supposed to handle. This may cause the connection to fail + completely. Sometimes you may need to explicitly select a SSL version to use + when connecting to make the connection succeed. + + An additional complication can be that modern SSL libraries sometimes are + built with support for older SSL and TLS versions disabled! + + All versions of SSL are considered insecure and should be avoided. Use TLS. + +## Ciphers + + Clients give servers a list of ciphers to select from. If the list doesn't + include any ciphers the server wants/can use, the connection handshake + fails. + + curl has recently disabled the user of a whole bunch of seriously insecure + ciphers from its default set (slightly depending on SSL backend in use). + + You may have to explicitly provide an alternative list of ciphers for curl + to use to allow the server to use a WEAK cipher for you. + + Note that these weak ciphers are identified as flawed. For example, this + includes symmetric ciphers with less than 128 bit keys and RC4. + + Schannel in Windows XP is not able to connect to servers that no longer + support the legacy handshakes and algorithms used by those versions, so we + advice against building curl to use Schannel on really old Windows versions. + + References: + + https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 + +## Allow BEAST + + BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means + to mitigate this attack, it turned out that some broken servers out there in + the wild didn't work properly with the BEAST mitigation in place. + + To make such broken servers work, the --ssl-allow-beast option was + introduced. Exactly as it sounds, it re-introduces the BEAST vulnerability + but on the other hand it allows curl to connect to that kind of strange + servers. + +## Disabling certificate revocation checks + + Some SSL backends may do certificate revocation checks (CRL, OCSP, etc) + depending on the OS or build configuration. The --ssl-no-revoke option was + introduced in 7.44.0 to disable revocation checking but currently is only + supported for Schannel (the native Windows SSL library), with an exception + in the case of Windows' Untrusted Publishers blacklist which it seems can't + be bypassed. This option may have broader support to accommodate other SSL + backends in the future. + + References: + + https://curl.haxx.se/docs/ssl-compared.html diff --git a/docs/SSLCERTS.md b/docs/SSLCERTS.md new file mode 100644 index 0000000000..2c5be68e6a --- /dev/null +++ b/docs/SSLCERTS.md @@ -0,0 +1,173 @@ +SSL Certificate Verification +============================ + +SSL is TLS +---------- + +SSL is the old name. It is called TLS these days. + + +Native SSL +---------- + +If libcurl was built with Schannel or Secure Transport support (the native SSL +libraries included in Windows and Mac OS X), then this does not apply to +you. Scroll down for details on how the OS-native engines handle SSL +certificates. If you're not sure, then run "curl -V" and read the results. If +the version string says "WinSSL" in it, then it was built with Schannel +support. + +It is about trust +----------------- + +This system is about trust. In your local CA certificate store you have certs +from *trusted* Certificate Authorities that you then can use to verify that the +server certificates you see are valid. They're signed by one of the CAs you +trust. + +Which CAs do you trust? You can decide to trust the same set of companies your +operating system trusts, or the set one of the known browsers trust. That's +basically trust via someone else you trust. You should just be aware that +modern operating systems and browsers are setup to trust *hundreds* of +companies and recent years several such CAs have been found untrustworthy. + +Certificate Verification +------------------------ + +libcurl performs peer SSL certificate verification by default. This is done +by using a CA certificate store that the SSL library can use to make sure the +peer's server certificate is valid. + +If you communicate with HTTPS, FTPS or other TLS-using servers using +certificates that are signed by CAs present in the store, you can be sure +that the remote server really is the one it claims to be. + +If the remote server uses a self-signed certificate, if you don't install a CA +cert store, if the server uses a certificate signed by a CA that isn't +included in the store you use or if the remote host is an impostor +impersonating your favorite site, and you want to transfer files from this +server, do one of the following: + + 1. Tell libcurl to *not* verify the peer. With libcurl you disable this with + `curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);` + + With the curl command line tool, you disable this with -k/--insecure. + + 2. Get a CA certificate that can verify the remote server and use the proper + option to point out this CA cert for verification when connecting. For + libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAPATH, capath);` + + With the curl command line tool: --cacert [file] + + 3. Add the CA cert for your server to the existing default CA certificate + store. The default CA certificate store can changed at compile time with the + following configure options: + + --with-ca-bundle=FILE: use the specified file as CA certificate store. CA + certificates need to be concatenated in PEM format into this file. + + --with-ca-path=PATH: use the specified path as CA certificate store. CA + certificates need to be stored as individual PEM files in this directory. + You may need to run c_rehash after adding files there. + + If neither of the two options is specified, configure will try to auto-detect + a setting. It's also possible to explicitly not hardcode any default store + but rely on the built in default the crypto library may provide instead. + You can achieve that by passing both --without-ca-bundle and + --without-ca-path to the configure script. + + If you use Internet Explorer, this is one way to get extract the CA cert + for a particular server: + + - View the certificate by double-clicking the padlock + - Find out where the CA certificate is kept (Certificate> + Authority Information Access>URL) + - Get a copy of the crt file using curl + - Convert it from crt to PEM using the openssl tool: + openssl x509 -inform DES -in yourdownloaded.crt \ + -out outcert.pem -text + - Add the 'outcert.pem' to the CA certificate store or use it stand-alone + as described below. + + If you use the 'openssl' tool, this is one way to get extract the CA cert + for a particular server: + + - `openssl s_client -showcerts -servername server -connect server:443 > cacert.pem` + - type "quit", followed by the "ENTER" key + - The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE" + markers. + - If you want to see the data in the certificate, you can do: "openssl + x509 -inform PEM -in certfile -text -out certdata" where certfile is + the cert you extracted from logfile. Look in certdata. + - If you want to trust the certificate, you can add it to your CA + certificate store or use it stand-alone as described. Just remember that + the security is no better than the way you obtained the certificate. + + 4. If you're using the curl command line tool, you can specify your own CA + cert path by setting the environment variable `CURL_CA_BUNDLE` to the path + of your choice. + + If you're using the curl command line tool on Windows, curl will search + for a CA cert file named "curl-ca-bundle.crt" in these directories and in + this order: + 1. application's directory + 2. current working directory + 3. Windows System directory (e.g. C:\windows\system32) + 4. Windows Directory (e.g. C:\windows) + 5. all directories along %PATH% + + 5. Get a better/different/newer CA cert bundle! One option is to extract the + one a recent Firefox browser uses by running 'make ca-bundle' in the curl + build tree root, or possibly download a version that was generated this + way for you: [CA Extract](https://curl.haxx.se/docs/caextract.html) + +Neglecting to use one of the above methods when dealing with a server using a +certificate that isn't signed by one of the certificates in the installed CA +certificate store, will cause SSL to report an error ("certificate verify +failed") during the handshake and SSL will then refuse further communication +with that server. + +Certificate Verification with NSS +--------------------------------- + +If libcurl was built with NSS support, then depending on the OS distribution, +it is probably required to take some additional steps to use the system-wide +CA cert db. RedHat ships with an additional module, libnsspem.so, which +enables NSS to read the OpenSSL PEM CA bundle. On openSUSE you can install +p11-kit-nss-trust which makes NSS use the system wide CA certificate store. NSS +also has a new [database format](https://wiki.mozilla.org/NSS_Shared_DB). + +Starting with version 7.19.7, libcurl automatically adds the 'sql:' prefix to +the certdb directory (either the hardcoded default /etc/pki/nssdb or the +directory configured with SSL_DIR environment variable). To check which certdb +format your distribution provides, examine the default certdb location: +/etc/pki/nssdb; the new certdb format can be identified by the filenames +cert9.db, key4.db, pkcs11.txt; filenames of older versions are cert8.db, +key3.db, secmod.db. + +Certificate Verification with Schannel and Secure Transport +----------------------------------------------------------- + +If libcurl was built with Schannel (Microsoft's native TLS engine) or Secure +Transport (Apple's native TLS engine) support, then libcurl will still perform +peer certificate verification, but instead of using a CA cert bundle, it will +use the certificates that are built into the OS. These are the same +certificates that appear in the Internet Options control panel (under Windows) +or Keychain Access application (under OS X). Any custom security rules for +certificates will be honored. + +Schannel will run CRL checks on certificates unless peer verification is +disabled. Secure Transport on iOS will run OCSP checks on certificates unless +peer verification is disabled. Secure Transport on OS X will run either OCSP +or CRL checks on certificates if those features are enabled, and this behavior +can be adjusted in the preferences of Keychain Access. + +HTTPS proxy +----------- + +Since version 7.52.0, curl can do HTTPS to the proxy separately from the +connection to the server. This TLS connection is handled separately from the +server connection so instead of `--insecure` and `--cacert` to control the +certificate verification, you use `--proxy-insecure` and `--proxy-cacert`. +With these options, you make sure that the TLS connection and the trust of the +proxy can be kept totally separate from the TLS connection to the server. diff --git a/docs/THANKS b/docs/THANKS new file mode 100644 index 0000000000..53735cb6f5 --- /dev/null +++ b/docs/THANKS @@ -0,0 +1,2139 @@ + This project has been alive for many years. Countless people have provided + feedback that have improved curl. Here follows a list of people that have + contributed (a-z order). + + If you have contributed but are missing here, please let us know! + +1ocalhost on github +3dyd on github +Aaro Koskinen +Aaron Oneal +Aaron Orenstein +Aaron Scarisbrick +aasivov on github +Abram Pousada +accountantM on github +AceCrow on Github +Adam Barclay +Adam Brown +Adam Coyne +Adam D. Moss +Adam Langley +Adam Light +Adam Marcionek +Adam Piggott +Adam Sampson +Adam Tkac +adnn on github +Adrian Burcea +Adrian Peniak +Adrian Schuur +Adriano Meirelles +afrind on github +ahodesuka on github +Ajit Dhumale +Akhil Kedia +Aki Koskinen +Akos Pasztory +Akshay Vernekar +Alain Danteny +Alan Jenkins +Alan Pinstein +Albert Chin-A-Young +Albert Choy +Alejandro Alvarez Ayllon +Alejandro R. Sedeño +Aleksandar Milivojevic +Aleksey Tulinov +Ales Mlakar +Ales Novak +Alessandro Ghedini +Alessandro Vesely +Alex aka WindEagle +Alex Baines +Alex Bligh +Alex Chan +Alex Fishman +Alex Grebenschikov +Alex Gruz +Alex Konev +Alex Malinovich +Alex Mayorga +Alex McLellan +Alex Neblett +Alex Nichols +Alex Potapenko +Alex Rousskov +Alex Samorukov +Alex Suykov +Alex Vinnik +Alexander Beedie +Alexander Dyagilev +Alexander Elgert +Alexander Klauer +Alexander Kourakos +Alexander Krasnostavsky +Alexander Lazic +Alexander Pepper +Alexander Peslyak +Alexander Sinditskiy +Alexander Traud +Alexander Zhuravlev +Alexey Borzov +Alexey Eremikhin +Alexey Melnichuk +Alexey Pesternikov +Alexey Simak +Alexey Zakhlestin +Alexis Carvalho +Alexis La Goutte +Alfonso Martone +Alfred Gebert +Allen Pulsifer +Alona Rossen +amishmm on github +Amit Katyal +Amol Pattekar +Amr Shahin +Anatol Belski +Anatoli Tubman +Anders Bakken +Anders Berg +Anders Gustafsson +Anders Havn +Anders Roxell +Anderson Sasaki +Anderson Toshiyuki Sasaki +Andi Jahja +Andre Guibert de Bruet +Andre Heinecke +Andreas Damm +Andreas Falkenhahn +Andreas Farber +Andreas Kostyrka +Andreas Malzahn +Andreas Ntaflos +Andreas Olsson +Andreas Rieke +Andreas Roth +Andreas Schneider +Andreas Schuldei +Andreas Streichardt +Andreas Wurf +Andrei Benea +Andrei Cipu +Andrei Karas +Andrei Kurushin +Andrei Neculau +Andrei Sedoi +Andrei Valeriu BICA +Andrei Virtosu +Andrej E Baranov +Andrew Benham +Andrew Biggs +Andrew Bushnell +Andrew de los Reyes +Andrew Francis +Andrew Fuller +Andrew Ishchuk +Andrew Krieger +Andrew Kurushin +Andrew Lambert +Andrew Moise +Andrew Potter +Andrew Robbins +Andrew Wansink +Andrey Labunets +Andrii Moiseiev +Andrius Merkys +Andrés García +Andy Cedilnik +Andy Fiddaman +Andy Serpa +Andy Tsouladze +Angus Mackay +anshnd on github +Anthon Pang +Anthony Avina +Anthony Bryan +Anthony G. Basile +Antoine Aubert +Antoine Calando +Anton Bychkov +Anton Gerasimov +Anton Kalmykov +Anton Malov +Anton Yabchinskiy +Antoni Villalonga +Antonio Larrosa +Antony74 on github +Antti Hätälä +arainchik on github +Archangel_SDY on github +Arkadiusz Miskiewicz +Armel Asselin +Arnaud Compan +Arnaud Ebalard +Arnaud Rebillout +Aron Bergman +Aron Rotteveel +Artak Galoyan +Arthur Murray +Arve Knudsen +Arvid Norberg +asavah on github +Ashish Shukla +Ask Bjørn Hansen +Askar Safin +Ates Goral +Augustus Saunders +Austin Green +Avery Fay +Axel Tillequin +Ayoub Boudhar +Balaji Parasuram +Balaji S Rao +Balaji Salunke +Balazs Kovacsics +Balint Szilakszi +Barry Abrahamson +Barry Pollard +Bart Whiteley +Bas Mevissen +Bas van Schaik +Bastien Bouclet +Basuke Suzuki +baumanj on github +bdry on github +Ben Boeckel +Ben Darnell +Ben Greear +Ben Kohler +Ben Madsen +Ben Noordhuis +Ben Van Hof +Ben Voris +Ben Winslow +Benbuck Nason +Benjamin Gerard +Benjamin Gilbert +Benjamin Johnson +Benjamin Kircher +Benjamin Ritcey +Benjamin Sergeant +Benoit Neil +Benoit Sigoure +Bernard Leak +Bernard Spil +Bernd Mueller +Bernhard Iselborn +Bernhard M. Wiedemann +Bernhard Reutner-Fischer +Bernhard Walle +Bert Huijben +Bertrand Demiddelaer +Bertrand Simonnet +Bill Doyle +Bill Egert +Bill Hoffman +Bill Middlecamp +Bill Nagel +Bill Pyne +Bjarni Ingi Gislason +Bjoern Franke +Bjoern Sikora +Bjorn Augustsson +Bjorn Reese +Björn Stenberg +Blaise Potard +bnfp on github +Bob Relyea +Bob Richmond +Bob Schader +bobmitchell1956 on github +Bogdan Nicula +Brad Burdick +Brad Fitzpatrick +Brad Harder +Brad Hards +Brad King +Brad Spencer +Bradford Bruce +bramus on github +Brandon Casey +Brandon Dong +Brandon Wang +Brendan Jurd +Brent Beardsley +Brian Akins +Brian Carpenter +Brian Chaplin +Brian Childs +Brian Chrisman +Brian Dessent +Brian E. Gallew +Brian J. Murrell +Brian Prodoehl +Brian R Duffy +Brian Ulm +Brock Noland +Bru Rom +Bruce Mitchener +Bruce Stephens +Bruno de Carvalho +Bruno Grasselli +Bruno Thomsen +Bryan Henderson +Bryan Kemp +bsammon on github +buzo-ffm on github +bxac on github +Bylon2 on github +Byrial Jensen +Caleb Raitto +Cameron Kaiser +Cameron MacMinn +Camille Moncelier +Caolan McNamara +Captain Basil +Carie Pointer +Carlo Cannas +Carlo Marcelo Arenas Belón +Carlo Teubner +Carlo Wood +Carlos ORyan +Carsten Lange +Casey O'Donnell +Catalin Patulea +cbartl on github +cclauss on github +Chad Monroe +Chandrakant Bagul +Charles Kerr +Charles Romestant +Chen Prog +Chester Liu +Chih-Chung Chang +Chih-Hsuan Yen +Chris "Bob Bob" +Chris Araman +Chris Carlmar +Chris Combes +Chris Conlon +Chris Deidun +Chris Faherty +Chris Flerackers +Chris Gaukroger +Chris Maltby +Chris Mumford +Chris Smowton +Chris Young +Christian Fillion +Christian Grothoff +Christian Heimes +Christian Hägele +Christian Krause +Christian Kurz +Christian Robottom Reis +Christian Schmitz +Christian Stewart +Christian Vogt +Christian Weisgerber +Christoph M. Becker +Christophe Demory +Christophe Dervieux +Christophe Legry +Christopher Conroy +Christopher Head +Christopher Palow +Christopher R. Palmer +Christopher Reid +Christopher Stone +Chungtsun Li +Ciprian Badescu +Claes Jakobsson +Clarence Gardner +Claudio Neves +clbr on github +Clemens Gruber +Cliff Crosland +Clifford Wolf +Clint Clayton +Clément Notin +cmfrolick on github +codesniffer13 on github +Cody Jones +Cody Mack +Colby Ranger +Colin Blair +Colin Hogben +Colin Watson +Colm Buckley +Constantine Sapuntzakis +Cory Benfield +Cory Nelson +Costya Shulyupin +Craig A West +Craig Andrews +Craig Davison +Craig de Stigter +Craig Markwardt +crazydef on github +Cris Bailiff +Cristian Greco +Cristian Rodríguez +Curt Bogmine +Cynthia Coan +Cyril B +Cyrill Osterwalder +Cédric Connes +Cédric Deltheil +D. Flinkmann +d912e3 on github +Da-Yoon Chung +daboul on github +Dag Ekengren +Dagobert Michelsen +Dair Grant +Dambaev Alexander +Damian Dixon +Damien Adant +Damien Vielpeau +Dan Becker +Dan Cristian +Dan Donahue +Dan Fandrich +Dan Jacobson +Dan Johnson +Dan Locks +Dan McNulty +Dan Nelson +Dan Petitt +Dan Torop +Dan Zitter +Daniel at touchtunes +Daniel Bankhead +Daniel Black +Daniel Cater +Daniel Egger +Daniel Gustafsson +Daniel Hwang +Daniel JeliÅ„ski +Daniel Johnson +Daniel Kahn Gillmor +Daniel Krügler +Daniel Lee Hwang +Daniel Lublin +Daniel Marjamäki +Daniel Melani +Daniel Mentz +Daniel Romero +Daniel Schauenberg +Daniel Seither +Daniel Shahaf +Daniel Silverstone +Daniel Steinberg +Daniel Stenberg +Daniel Theron +Daphne Luong +Dario Nieuwenhuis +Dario Weißer +Darryl House +Darshan Mody +Darío Hereñú +dasimx on github +Dave Dribin +Dave Halbakken +Dave Hamilton +Dave May +Dave Reisner +Dave Thompson +Dave Vasilevsky +Davey Shafik +David Bau +David Benjamin +David Binderman +David Blaikie +David Byron +David Cohen +David E. Narváez +David Eriksson +David Garske +David Houlder +David Hull +David J Meyer +David James +David Kalnischkies +David Kierznowski +David Kimdon +David L. +David Lang +David LeBlanc +David Lopes +David Lord +David McCreedy +David Odin +David Phillips +David Rosenstrauch +David Ryskalczyk +David Sanderson +David Schweikert +David Shaw +David Strauss +David Tarendash +David Thiel +David Walser +David Woodhouse +David Wright +David Yan +dbrowndan on github +Dengminwen +Denis Chaplygin +Denis Feklushkin +Denis Ollier +Dennis Clarke +Derek Higgins +Desmond O. Chang +destman on github +Detlef Schmier +Dheeraj Sangamkar +Didier Brisebourg +Diego Bes +Diego Casorran +Dilyan Palauzov +Dima Barsky +Dima Pasechnik +Dima Tisnek +Dimitar Boevski +Dimitre Dimitrov +Dimitrios Apostolou +Dimitrios Siganos +Dimitris Sarris +Dinar +Dirk Eddelbuettel +Dirk Feytons +Dirk Manske +dkjjr89 on github +dkwolfe4 on github +Dmitri Shubin +Dmitri Tikhonov +Dmitriy Sergeyev +dmitrmax on github +Dmitry Bartsevich +Dmitry Eremin-Solenikov +Dmitry Falko +Dmitry Kostjuchenko +Dmitry Kurochkin +Dmitry Mikhirev +Dmitry Popov +Dmitry Rechkin +Dmitry S. Baikov +dnivras on github +Dolbneff A.V +Domenico Andreoli +Dominick Meglio +Dominik Hölzl +Dominique Leuenberger +Don J Olmstead +Dongliang Mu +Doron Behar +Doug Kaufman +Doug Porter +Douglas Creager +Douglas E. Wegscheid +Douglas Kilpatrick +Douglas Mencken +Douglas R. Horner +Douglas Steinwand +Dov Murik +dpull on github +Drake Arconis +dtmsecurity on github +Duane Cathey +Duncan Mac-Vicar Prett +Dustin Boswell +Dusty Mabe +Duy Phan Thanh +Dwarakanath Yadavalli +Dylan Ellicott +Dylan Salisbury +Dániel Bakai +Early Ehlinger +Earnestly on github +Eason-Yu on github +Ebenezer Ikonne +Ed Morley +Edgaras JanuÅ¡auskas +Edin Kadribasic +Edmond Yu +Eduard Bloch +Edward Kimmel +Edward Rudd +Edward Sheldrake +Edward Thomson +Eelco Dolstra +Eetu Ojanen +Egon Eckert +Eldar Zaitov +elelel on github +elephoenix on github +Eli Schwartz +Elia Tufarolo +Elliot Saba +Ellis Pritchard +Elmira A Semenova +elsamuko on github +Emanuele Bovisio +Emil Engler +Emil Lerner +Emil Romanus +Emiliano Ida +Emmanuel Tychon +Enrico Scholz +Enrik Berkhan +Eramoto Masaya +Eric Cooper +Eric Curtin +Eric Gallager +Eric Hu +Eric Landes +Eric Lavigne +Eric Lubin +Eric Melville +Eric Mertens +Eric Rautman +Eric Rescorla +Eric Ridge +Eric Rosenquist +Eric S. Raymond +Eric Thelin +Eric Vergnaud +Eric Wong +Eric Wu +Eric Young +Erick Nuwendam +Erik Jacobsen +Erik Janssen +Erik Johansson +Erik Minekus +Ernest Beinrohr +Ernst Sjöstrand +Erwan Legrand +Erwin Authried +Ethan Glasser Camp +Etienne Simard +Eugene Kotlyarov +Evan Jordan +Even Rouault +Evert Pot +Evgeny Grin +Evgeny Turnaev +eXeC64 on github +Eygene Ryabinkin +Fabian Frank +Fabian Hiernaux +Fabian Keil +Fabian Ruff +Fabrice Fontaine +Fabrizio Ammollo +Fahim Chandurwala +Faizur Rahman +fds242 on github +Federico Bianchi +Fedor Karpelevitch +Fedor Korotkov +Feist Josselin +Felipe Gasper +Felix Hädicke +Felix Kaiser +Felix von Leitner +Felix Yan +Feng Tu +Fernando Muñoz +Flavio Medeiros +Florian Pritz +Florian Schoppmann +Florian Weimer +Florin Petriuc +Forrest Cahoon +Francisco Moraes +Francisco Sedano +Francois Petitjean +Francois Rivard +Frank Denis +Frank Gevaerts +Frank Hempel +Frank Keeney +Frank McGeough +Frank Meier +Frank Ticheler +Frank Van Uffelen +FrantiÅ¡ek KuÄera +François Charlier +Fred Machado +Fred New +Fred Noz +Fred Stluka +Frederic Lepied +Frederik B +Fredrik Thulin +Gabriel Kuri +Gabriel Sjoberg +Garrett Holmstrom +Gary Maxwell +Gaurav Malhotra +Gautam Kachroo +Gautam Mani +Gavrie Philipson +Gaz Iqbal +Gaël Portay +Geeknik Labs +Geoff Beier +Georg Horn +Georg Huettenegger +Georg Lippitsch +Georg Wicherski +George Liu +Gerd v. Egidy +Gergely Nagy +Gerhard Herre +Gerrit Bruchhäuser +Ghennadi Procopciuc +Giancarlo Formicuccia +Giaslas Georgios +Gil Weber +Gilad +Gilbert Ramirez Jr. +Gilles Blanc +Gilles Vollant +Giorgos Oikonomou +Gisle Vanem +GitYuanQu on github +Giuseppe Attardi +Giuseppe D'Ambrosio +Giuseppe Persico +Glen A Johnson Jr. +Glen Nakamura +Glen Scott +Glenn Sheridan +Google Inc. +Gordon Marler +Gorilla Maguila +Gou Lingfeng +Grant Erickson +Grant Pannell +Greg Hewgill +Greg Morse +Greg Onufer +Greg Pratt +Greg Rowe +Greg Zavertnik +Gregory Nicholls +Gregory Szorc +Griffin Downs +Grigory Entin +Guenole Bescon +Guido Berhoerster +Guillaume Arluison +guitared on github +Gunter Knauf +Gustaf Hui +Gustavo Grieco +Guy Poizat +GwanYeong Kim +Gwenole Beauchesne +Gökhan Åžengün +Götz Babin-Ebell +Hagai Auro +Haibo Huang +Hamish Mackenzie +hamstergene on github +Han Han +Han Qiao +Hang Kin Lau +Hang Su +Hannes Magnusson +Hanno Böck +Hanno Kranzhoff +Hans Steegers +Hans-Jurgen May +Hardeep Singh +Haris Okanovic +Harold Stuart +Harry Sintonen +Harshal Pradhan +Hauke Duden +He Qin +Heikki Korpela +Heinrich Ko +Heinrich Schaefer +Helge Klein +Helmut K. C. Tessarek +Helwing Lutz +Hendrik Visage +Henri Gomez +Henrik Gaßmann +Henrik Storner +Henry Ludemann +Henry Roeland +Herve Amblard +Hidemoto Nakada +Ho-chi Chen +Hoi-Ho Chan +Hongli Lai +Howard Blaise +Howard Chu +hsiao yi +Hubert Kario +Huzaifa Sidhpurwala +Hzhijun +Ian D Allen +Ian Fette +Ian Ford +Ian Gulliver +Ian Lynagh +Ian Turner +Ian Wilkes +Ignacio Vazquez-Abrams +Igor Franchuk +Igor Khristophorov +Igor Makarov +Igor Novoseltsev +Igor Polyakov +Ihor Karpenko +Iida Yosiaki +Ilguiz Latypov +Ilja van Sprundel +Ilya Kosarev +imilli on github +Immanuel Gregoire +Inca R +infinnovation-dev on github +Ingmar Runge +Ingo Ralf Blum +Ingo Wilken +Irfan Adilovic +Ironbars13 on github +Irving Wolfe +Isaac Boukris +Isaiah Norton +Ishan SinghLevett +Ithubg on github +Ivan Avdeev +IvanoG on github +Ivo Bellin Salarin +iz8mbw on github +Jack Zhang +Jackarain on github +Jacky Lam +Jacob Barthelmeh +Jacob Meuser +Jacob Moshenko +Jactry Zeng +Jad Chamcham +Jaime Fullaondo +jakirkham on github +Jakub Wilk +Jakub Zakrzewski +James Atwill +James Brown +James Bursa +James Cheng +James Clancy +James Cone +James Dury +James Fuller +James Gallagher +James Griffiths +James Housley +James Knight +James MacMillan +James Slaughter +Jamie Lokier +Jamie Newton +Jamie Wilkinson +Jan Alexander Steffens +Jan Chren +Jan Ehrhardt +Jan Koen Annot +Jan Kunder +Jan Schaumann +Jan Schmidt +Jan Van Boghout +JanB on github +Janne Johansson +Jared Jennings +Jared Lundell +Jari Aalto +Jari Sundell +jasal82 on github +Jason Baietto +Jason Glasgow +Jason Juang +Jason Lee +Jason Liu +Jason McDonald +Jason S. Priebe +Javier Barroso +Javier Blazquez +Javier G. Sogo +Javier Sixto +Jay Austin +Jayesh A Shah +Jaz Fresh +Jean Fabrice +Jean Gressmann +Jean Jacques Drouin +Jean-Claude Chauve +Jean-Francois Bertrand +Jean-Francois Durand +Jean-Louis Lemaire +Jean-Marc Ranger +Jean-Noël Rouvignac +Jean-Philippe Barrette-LaPierre +Jeff Connelly +Jeff Hodges +Jeff Johnson +Jeff King +Jeff Lawson +Jeff Mears +Jeff Phillips +Jeff Pohlmeyer +Jeff Weber +Jeffrey Walton +Jens Finkhaeuser +Jens Rantil +Jens Schleusener +Jeremie Rapin +Jeremy Friesner +Jeremy Huddleston +Jeremy Lainé +Jeremy Lin +Jeremy Pearson +Jeremy Tan +Jeroen Koekkoek +Jeroen Ooms +Jerome Muffat-Meridol +Jerome Robert +Jerome Vouillon +Jerry Krinock +Jerry Wu +Jes Badwal +Jesper Jensen +Jesse Chisholm +Jesse Noller +Jesse Tan +jethrogb on github +Jie He +Jim Drash +Jim Freeman +Jim Fuller +Jim Hollinger +Jim Meyering +Jimmy Gaussen +Jiri Dvorak +Jiri Hruska +Jiri Jaburek +Jiří Malák +jnbr on github +Jocelyn Jaubert +Joe Halpin +Joe Malicki +Joe Mason +Joel Chen +Joel Depooter +Jofell Gallardo +Johan Anderson +Johan Lantz +Johan Nilsson +Johan van Selst +Johannes Bauer +Johannes Ernst +Johannes G. Kristinsson +Johannes Schindelin +John A. Bristor +John Bradshaw +John Butterfield +John Coffey +John Crow +John David Anglin +John DeHelian +John Dennis +John Dunn +John E. Malmberg +John Gardiner Myers +John Hascall +John Janssen +John Joseph Bachir +John Kelly +John Kohl +John Lask +John Levon +John Lightsey +John Marino +John Marshall +John McGowan +John P. McCaskey +John Schroeder +John Starks +John Suprock +John V. Chow +John Wanghui +John Weismiller +John Wilkinson +John-Mark Bell +Johnny Luong +Jojojov on github +Jon DeVree +Jon Grubbs +Jon Nelson +Jon Rumsey +Jon Sargeant +Jon Seymour +Jon Spencer +Jon Torrey +Jon Travis +Jon Turner +Jonas Forsman +Jonas Minnberg +Jonas Schnelli +Jonas Vautherin +Jonatan Lander +Jonatan Vela +Jonathan Cardoso Machado +Jonathan Hseu +Jonathan Moerman +Jonathan Nieder +Jongki Suwandi +jonrumsey on github +Joombalaya on github +Joonas Kuorilehto +Jose Alf +Jose Kahan +Josef Wolf +Josh Bialkowski +Josh Kapell +joshhe on github +Joshua Kwan +Joshua Swink +Josie Huddleston +Josue Andrade Gomes +Jozef Kralik +Juan Barreto +Juan F. Codagnone +Juan Ignacio Hervás +Juan RP +Judson Bishop +Juergen Hoetzel +Juergen Wilke +Jukka Pihl +Julian Noble +Julian Ospald +Julian Romero Nieto +Julian Taylor +Julian Z +Julien Chaffraix +Julien Nabet +Julien Royer +Jun-ichiro itojun Hagino +jungle-boogie on github +Junho Choi +Jurij Smakov +Juro Bystricky +Justin Clift +Justin Ehlert +Justin Fletcher +Justin Karneges +Justin Maggard +jveazey on github +jzinn on github +János Fekete +Jérémy Rocher +Jörg Mueller-Tolk +Jörn Hartroth +K. R. Walker +ka7 on github +Kai Engert +Kai Noda +Kai Sommerfeld +Kai-Uwe Rommel +Kalle Vahlman +Kamil Dudka +Kang Lin +Kang-Jin Lee +Karl Moerder +Karol Pietrzak +Kartik Mahajan +Kaspar Brand +Katie Wang +Katsuhiko YOSHIDA +Kazuho Oku +Kees Cook +Kees Dekker +Keith MacDonald +Keith McGuigan +Keith Mok +Ken Hirsch +Ken Rastatter +Kenny To +Kent Boortz +Keshav Krity +Kevin Baughman +Kevin Fisk +Kevin Ji +Kevin Lussier +Kevin R. Bulgrien +Kevin Reed +Kevin Roth +Kevin Smith +Kim Minjoong +Kim Rinnewitz +Kim Vandry +Kimmo Kinnunen +Kirill Marchuk +Kjell Ericson +Kjetil Jacobsen +Klaus Stein +Klevtsov Vadim +Kobi Gurkan +Koen Dergent +Konstantin Isakov +Konstantin Kushnir +kouzhudong on github +kreshano on github +Kris Kennaway +Krishnendu Majumdar +Krister Johansen +Kristian Gunstone +Kristian Köhntopp +Kristian Mide +Kristiyan Tsaklev +Kristoffer Gleditsch +Kunal Ekawde +Kurt Fankhauser +Kyle Abramowitz +Kyle Edwards +Kyle J. McKay +Kyle L. Huff +Kyle Sallee +Kyohei Kadota +Kyselgov E.N +l00p3r on Hackerone +Lachlan O'Dea +Ladar Levison +Lance Ware +Larry Campbell +Larry Fahnoe +Larry Lin +Larry Stefani +Larry Stone +Lars Buitinck +Lars Gustafsson +Lars J. Aas +Lars Johannesen +Lars Nilsson +Lars Torben Wilson +Laurent Bonnans +Laurent Rabret +Lauri Kasanen +Laurie Clark-Michalek +Lawrence Matthews +Lawrence Wagerfield +Legoff Vincent +Lehel Bernadt +Leif W +Leigh Purdie +Leith Bade +Len Krause +Len Marinaccio +Lenaic Lefever +Lenny Rachitsky +Leo Neat +Leon Breedt +Leon Winter +Leonardo Rosati +Leonardo Taccari +Liam Healy +lijian996 on github +Lijo Antony +Linas Vepstas +Lindley French +Ling Thio +Linos Giannopoulos +Linus Lewandowski +Linus Nielsen Feltzing +Linus Nordberg +Lior Kaplan +Lisa Xu +Liviu Chircu +Liza Alenchery +Lloyd Fournier +Lluís Batlle i Rossell +Loganaden Velvindron +Loic Dachary +Loren Kirkby +Luan Cestari +Luca Altea +Luca Boccassi +Lucas Adamski +Lucas Pardue +Lucas Severo +Ludek Finstrle +Ludovico Cavedon +Ludwig Nussel +Lukas Ruzicka +Lukasz Czekierda +lukaszgn on github +Luke Amery +Luke Call +Luke Dashjr +Luo Jinghua +Luong Dinh Dung +Luz Paz +Luật Nguyá»…n +Lyman Epp +Lyndon Hill +Maciej Karpiuk +Maciej Puzio +Maciej W. Rozycki +madblobfish on github +Mahmoud Samir Fayed +Maks Naumov +Maksim Kuzevanov +Maksim Stsepanenka +Mamoru Tasaka +Mamta Upadhyay +Mandy Wu +Manfred Schwarb +MAntoniak on github +Manuel Massing +Marc Aldorasi +Marc Boucher +Marc Deslauriers +Marc Doughty +Marc Hesse +Marc Hörsken +Marc Kleine-Budde +Marc Renault +Marc Schlatter +Marc-Antoine Perennou +marc-groundctl on github +Marcel Hernandez +Marcel Raad +Marcel Roelofs +Marcelo Echeverria +Marcelo Juchem +Marcin Adamski +Marcin Gryszkalis +Marcin Konicki +Marco Deckel +Marco G. Salvagno +Marco Maggi +Marcos Diazr +Marcus Hoffmann +Marcus Klein +Marcus Sundberg +Marcus Webster +Marian Klymov +Mario Schroeder +Mark Brand +Mark Butler +Mark Davies +Mark Hamilton +Mark Incley +Mark Karpeles +Mark Lentczner +Mark Nottingham +Mark Salisbury +Mark Snelling +Mark Tully +Mark W. Eichin +Mark Wotton +Markus Duft +Markus Elfring +Markus Koetter +Markus Moeller +Markus Oberhumer +Markus Westerlind +Maros Priputen +Marquis de Muesli +Martijn Koster +Martin Ankerl +Martin C. Martin +Martin Drasar +Martin Dreher +Martin Frodl +Martin Galvan +Martin Gartner +Martin Hager +Martin Hedenfalk +Martin Jansen +Martin Kammerhofer +Martin Kepplinger +Martin Lemke +Martin Skinner +Martin Staael +Martin Storsjö +Martin Vejnár +Marty Kuhrt +Maruko +masbug on github +Massimiliano Fantuzzi +Massimiliano Ziccardi +Massimo Callegari +Mateusz Loskot +Mathias Axelsson +Mathieu Legare +Mats Lidell +Matt Arsenault +Matt Ford +Matt Kraai +Matt McClure +Matt Veenstra +Matt Witherspoon +Matt Wixson +Matteo Bignotti +Matteo Bignottignotti +Matteo Rocco +Matthew Blain +Matthew Clarke +Matthew Hall +Matthew Kerwin +Matthew Whitehead +Matthias Bolte +Mattias Fornander +Matus Uzak +Maurice Barnum +Mauro Iorio +Mauro Rappa +Max Dymond +Max Katsev +Max Kellermann +Max Khon +Max Savenkov +Maxim Ivanov +Maxim Perenesenko +Maxim Prohorov +Maxime Larocque +Maxime Legros +mbeifuss on github +mccormickt12 on github +Mehmet Bozkurt +Mekonikum +Melissa Mears +Mert YazıcıoÄŸlu +Mettgut Jamalla +Michael Anti +Michael Benedict +Michael Brehm +Michael Calmer +Michael Cronenworth +Michael Curtis +Michael Day +Michael Felt +Michael Forney +Michael Gmelin +Michael Goffioul +Michael Jahn +Michael Jerris +Michael Kalinin +Michael Kaufmann +Michael Kilburn +Michael Kujawa +Michael König +Michael Lee +Michael Maltese +Michael Mealling +Michael Mueller +Michael Osipov +Michael Schmid +Michael Smith +Michael Stapelberg +Michael Steuer +Michael Stillwell +Michael Vittiglio +Michael Wallner +Michal Bonino +Michal Marek +Michal Trybus +Michal ÄŒaplygin +MichaÅ‚ Antoniak +MichaÅ‚ Fita +MichaÅ‚ Górny +MichaÅ‚ Janiszewski +MichaÅ‚ Kowalczyk +MichaÅ‚ Piechowski +Michel Promonet +Michele Bini +Miguel Angel +Miguel Diaz +migueljcrum on github +Mihai Ionescu +Mikael Johansson +Mikael Sennerholm +Mikalai Ananenka +Mike Bytnar +Mike Crowe +Mike Dobbs +Mike Dowell +Mike Frysinger +Mike Giancola +Mike Hasselberg +Mike Henshaw +Mike Hommey +Mike Mio +Mike Norton +Mike Power +Mike Protts +Mike Revi +Miklos Nemeth +MiloÅ¡ Ljumović +Mingliang Zhu +Miroslav Franc +Miroslav Spousta +Mischa Salle +Mitz Wark +mkzero on github +Mohamed Lrhazi +Mohammad AlSaleh +Mohammad Hasbini +Mohun Biswas +momala454 on github +moohoorama on github +Mostyn Bramley-Moore +Moti Avrahami +MrdUkk on github +MrSorcus on github +Muz Dima +Myk Taylor +Nach M. S. +Nagai H +naost3rn on github +Nate Prewitt +Nathan Coulter +Nathan O'Sullivan +Nathanael Nerode +Nathaniel J. Smith +Nathaniel Waisbrot +Naveen Chandran +Naveen Noel +Neal Poole +nedres on github +neex on github +Nehal J Wani +neheb on github +Neil Bowers +Neil Dunbar +Neil Kolban +Neil Spring +nevv on HackerOne/curl +Niall O'Reilly +niallor on github +nianxuejie on github +Nic Roets +Nicholas Maniscalco +Nick Draffen +Nick Gimbrone +Nick Humfrey +Nick Miyake +Nick Zitzmann +Nicklas Avén +Nico Baggus +nico-abram on github +Nicolas Berloquin +Nicolas Croiset +Nicolas François +Nicolas Grekas +Nicolas Guillier +Nicolas Morey-Chaisemartin +Niels van Tongeren +Nikita Schmidt +Nikitinskit Dmitriy +Niklas Angebrand +Niklas Hambüchen +Nikolai Kondrashov +Nikos Mavrogiannopoulos +Nikos Tsipinakis +niner on github +Ning Dong +Nir Soffer +Nis Jorgensen +nk +Nobuhiro Ban +Nodak Sodak +nopjmp on github +Norbert Frese +Norbert Kett +Norbert Novotny +NTMan on Github +Octavio Schroeder +Ofer +Okhin Vasilij +Ola Mork +Olaf Flebbe +Olaf Stüben +Oleg Pudeyev +Olen Andoni +olesteban on github +Oli Kingshott +Oliver Gondža +Oliver Graute +Oliver Kuckertz +Oliver Schindler +Olivier Berger +Olivier Brunel +Omar Ramadan +omau on github +Orange Tsai +Oren Souroujon +Oren Tirosh +Orgad Shaneh +Ori Avtalion +osabc on github +Oscar Koeroo +Oscar Norlander +Oskar Liljeblad +Oumph on github +ovidiu-benea on github +P R Schaffner +Palo Markovic +Paolo Mossino +Paolo Piacentini +Paras Sethia +Pascal Gaudette +Pascal Terjan +Pasha Kuznetsov +Pasi Karkkainen +Pat Ray +patelvivekv1993 on github +patnyb on github +Patrice Guerin +Patricia Muscalu +Patrick Bihan-Faou +Patrick Dawson +Patrick McManus +Patrick Monnerat +Patrick Rapin +Patrick Schlangen +Patrick Scott +Patrick Smith +Patrick Watson +Patrik Thunstrom +Pau Garcia i Quiles +Paul B. Omta +Paul Donohue +Paul Dreik +Paul Groke +Paul Harrington +Paul Harris +Paul Hoffman +Paul Howarth +Paul Joyce +Paul Marks +Paul Marquis +Paul Moore +Paul Nolan +Paul Oliver +Paul Querna +Paul Saab +Paulo Roberto Tomasi +Pavel Cenek +Pavel Gushchin +Pavel Löbl +Pavel Orehov +Pavel Pavlov +Pavel Raiskup +Pavel Rochnyak +Pavel Volgarev +Pavol Markovic +Pawel A. Gajda +Pawel Kierski +Pedro Larroy +Pedro Monreal +Pedro Neves +pendrek at hackerone +Peng Li +Per Lundberg +Per Malmberg +Pete Lomax +Peter Bray +Peter Forret +Peter Frühberger +Peter Gal +Peter Heuchert +Peter Hjalmarsson +Peter Korsgaard +Peter Lamare +Peter Lamberg +Peter Laser +Peter O'Gorman +Peter Pentchev +Peter Piekarski +Peter Silva +Peter Simonyi +Peter Su +Peter Sumatra +Peter Sylvester +Peter Todd +Peter Varga +Peter Verhas +Peter Wang +Peter Wu +Peter Wullinger +Peteris Krumins +Petr Bahula +Petr Novak +Petr Pisar +Petr Voytsik +Phil Blundell +Phil Crump +Phil Karn +Phil Lisiecki +Phil Pellouchoud +Philip Craig +Philip Gladstone +Philip Langdale +Philip Prindeville +Philipp Waehnert +Philippe Hameau +Philippe Marguinaud +Philippe Raoult +Philippe Vaucher +Pierre +Pierre Brico +Pierre Chapuis +Pierre Joye +Pierre Ynard +Pierre-Yves Bigourdan +Piotr Dobrogost +Piotr Komborski +Po-Chuan Hsieh +Pooyan McSporran +Poul T Lomholt +Pramod Sharma +Prash Dush +Praveen Pvs +Priyanka Shah +PrzemysÅ‚aw Tomaszewski +pszemus on github +Puneet Pawaia +Quagmire +Quanah Gibson-Mount +Quinn Slack +R. Dennis Steed +Radu Simionescu +Rafa Muyo +Rafael Antonio +Rafael Sagula +Rafayel Mkrtchyan +Rafaël Carré +Rainer Canavan +Rainer Jung +Rainer Koenig +Rainer Müller +Rajesh Naganathan +Rajkumar Mandal +Ralf S. Engelschall +Ralph Beckmann +Ralph Mitchell +Ram Krushna Mishra +Ran Mozes +Randall S. Becker +Randy Armstrong +Randy McMurchy +Raphael Gozzo +Ravi Pratap +Ray Dassen +Ray Pekowski +Ray Satiro +Razvan Cojocaru +Reed Loden +Reinhard Max +Reinout van Schouwen +Remco van Hooff +Remi Gacogne +Remo E +Renato Botelho +Renaud Allard +Renaud Chaillat +Renaud Duhaut +Renaud Guillard +Renaud Lehoux +Rene Bernhardt +Rene Rebe +Reuven Wachtfogel +Reza Arbab +Ricardo Cadime +Ricardo Gomes +Rich Burridge +Rich Gray +Rich Mirch +Rich Rauenzahn +Rich Turner +Richard Adams +Richard Alcock +Richard Archer +Richard Atterer +Richard Bowker +Richard Bramante +Richard Clayton +Richard Cooper +Richard Gorton +Richard Gray +Richard Hosking +Richard Hsu +Richard Michael +Richard Moore +Richard Prescott +Richard Silverman +Richard van den Berg +Richy Kim +Rick Deist +Rick Jones +Rick Richardson +Rick Welykochy +Rickard Hallerbäck +Ricki Hirner +Ricky Leverence +Ricky-Tigg on github +Rider Linden +Rikard Falkeborn +Rob Cotrone +Rob Crittenden +Rob Davies +Rob Jones +Rob Sanders +Rob Stanzel +Rob Ward +Robert A. Monat +Robert B. Harris +Robert D. Young +Robert Dunaj +Robert Foreman +Robert Iakobashvili +Robert Kolcun +Robert Linden +Robert Olson +Robert Prag +Robert Schumann +Robert Weaver +Robert Wruck +Robin Cornelius +Robin Johnson +Robin Kay +Robson Braga Araujo +Rod Widdowson +Rodger Combs +Rodney Simmons +Rodric Glaser +Rodrigo Silva +Roger Leigh +Roland Blom +Roland Hieber +Roland Krikava +Roland Zimmermann +Rolf Eike Beer +Rolland Dudemaine +Romain Coltel +Romain Fliedel +Romain Geissler +Roman Koifman +Roman Mamedov +Romulo A. Ceccon +Ron Eldor +Ron Parker +Ron Zapp +Ronnie Mose +Rosimildo da Silva +Roy Bellingan +Roy Shan +Rune Kleveland +Ruslan Baratov +Ruslan Gazizov +Rutger Hofman +Ruurd Beerstra +RuurdBeerstra on github +Ryan Braud +Ryan Chan +Ryan Nelson +Ryan Schmidt +Ryan Scott +Ryan Winograd +Ryuichi KAWAMATA +Rémy Léone +S. Moonesamy +Salah-Eddin Shaban +Salvador Dávila +Salvatore Sorrentino +Sam Deane +Sam Hurst +Sam Roth +Sam Schanken +Sampo Kellomaki +Samuel Díaz García +Samuel Listopad +Samuel Surtees +Samuel Thibault +Sander Gates +Sandor Feldi +Santhana Todatry +Santino Keupp +Saqib Ali +Sara Golemon +Saran Neti +Sascha Swiercy +Saul good +Saurav Babu +sayrer on github +SBKarr on github +Scott Bailey +Scott Barrett +Scott Cantor +Scott Davis +Scott McCreary +Sean Boudreau +Sean Burford +Sean MacLennan +Sean Miller +Sebastiaan van Erk +Sebastian Haglund +Sebastian Mundry +Sebastian Pohlschmidt +Sebastian Rasmussen +Senthil Raja Velu +Sergei Kuzmin +Sergei Nikulov +Sergey Ogryzkov +Sergey Tatarincev +Sergii Kavunenko +Sergii Pylypenko +Sergio Ballestrero +Sergio Barresi +Sergio Borghese +Serj Kalichev +Seshubabu Pasam +Seth Mos +Sevan Janiyan +Sh Diao +Shachaf Ben-Kiki +Shailesh Kapse +Shankar Jadhavar +Shao Shuchao +Sharad Gupta +Shard +Shaun Jackman +Shawn Landden +Shawn Poulson +Shine Fan +Shiraz Kanga +Shlomi Fish +Shmulik Regev +Siddhartha Prakash Jain +Sidney San Martín +Siegfried Gyuricsko +silveja1 on github +Simon Dick +Simon H. +Simon Josefsson +Simon Legner +Simon Liu +Simon Warta +SLDiggie on github +smuellerDD on github +Somnath Kundu +Song Ma +Sonia Subramanian +Spacen Jasset +Spezifant on github +Spiridonoff A.V +Spoon Man +Spork Schivago +sstruchtrup on github +Stadler Stephan +Stan van de Burgt +Stanislav Ivochkin +Stanislav Zidek +steelman on github +Stefan Agner +Stefan Bühler +Stefan Eissing +Stefan Esser +Stefan Grether +Stefan Kanthak +Stefan Krause +Stefan Neis +Stefan Teleman +Stefan Tomanek +Stefan Ulrich +Stefano Simonelli +Steinar H. Gunderson +steini2000 on github +Stepan Broz +Stephan Bergmann +Stephan Lagerholm +Stephan Mühlstrasser +Stephan Szabo +Stephen Brokenshire +Stephen Collyer +Stephen Kick +Stephen More +Stephen Toub +Sterling Hughes +Steve Green +Steve H Truong +Steve Havelka +Steve Holme +Steve Lhomme +Steve Little +Steve Marx +Steve Oliphant +Steve Roskowski +Steve Walch +Steven Bazyl +Steven G. Johnson +Steven Gu +Steven M. Schweda +Steven Parkes +Stian Soiland-Reyes +Stoned Elipot +stootill on github +Stuart Henderson +SumatraPeter on github +Sune Ahlgren +Sunny Bean +Sunny Purushe +Sven Anders +Sven Blumenstein +Sven Neuhaus +Sven Wegener +Svyatoslav Mishyn +swalkaus at yahoo.com +Sylvestre Ledru +Symeon Paraschoudis +Sébastien Willemijns +T. Bharath +T. Yamada +Tae Hyoung Ahn +Tae Wong +Taiyu Len +Taneli Vähäkangas +Tanguy Fautre +tarek112 on github +Tatsuhiro Tsujikawa +Teemu Yli-Elsila +Temprimus +Terri Oda +Terry Wu +The Infinnovation team +TheAssassin on github +Theodore Dubois +tholin on github +Thomas Braun +Thomas Gamper +Thomas Glanzmann +Thomas J. Moore +Thomas Klausner +Thomas L. Shinnick +Thomas Lopatic +Thomas Petazzoni +Thomas Ruecker +Thomas Schwinge +Thomas Tonino +Thomas van Hesteren +Thomas Vegas +Thorsten Schöning +Tiit Pikma +Till Maas +Tim Ansell +Tim Baker +Tim Bartley +Tim Chen +Tim Costello +Tim Harder +Tim Heckman +Tim Mcdonough +Tim Newsome +Tim Rühsen +Tim Sneddon +Tim Stack +Tim Starling +Tim Tassonis +Tim Verhoeven +Timo Sirainen +Timotej Lazar +Timothe Litt +Timothy Polich +Tinus van den Berg +TJ Saunders +Tobias Blomberg +Tobias Hieta +Tobias Hintze +Tobias Lindgren +Tobias Markus +Tobias Rundström +Tobias Stoeckmann +Toby Peterson +Todd A Ouska +Todd Kaufmann +Todd Kulesza +Todd Short +Todd Vierling +Tom Benoist +Tom Donovan +Tom Grace +Tom Greenslade +Tom Lee +Tom Mattison +Tom Moers +Tom Mueller +Tom Regner +Tom Seddon +Tom Sparrow +Tom van der Woerdt +Tom Wright +Tom Zerucha +Tomas Hoger +Tomas Jakobsson +Tomas Mlcoch +Tomas Mraz +Tomas Pospisek +Tomas Szepe +Tomas Tomecek +Tomasz Kojm +Tomasz Lacki +Tommie Gannert +tommink[at]post.pl +Tommy Tam +Ton Voon +Toni Moreno +Tony Kelman +tonystz on Github +Toon Verwaest +Tor Arntsen +Torben Dannhauer +Torsten Foertsch +Toshio Kuratomi +Toshiyuki Maezawa +tpaukrt on github +Traian Nicolescu +Travis Burtrum +Travis Obenhaus +Trivikram Kamat +Troels Walsted Hansen +Troy Engel +Tseng Jun +Tuomo Rinne +Tupone Alfredo +Tyler Hall +Török Edwin +Ulf Härnhammar +Ulf Samuelsson +Ulrich Doehner +Ulrich Telle +Ulrich Zadow +Valentin David +Valerii Zapodovnikov +vanillajonathan on github +Vasiliy Faronov +Vasily Lobaskin +Vasy Okhin +Venkat Akella +Venkataramana Mokkapati +Vicente Garcia +Victor Magierski +Victor Snezhko +Vijay Panghal +Vikram Saxena +Viktor Szakats +Vilhelm Prytz +Ville Skyttä +Vilmos Nebehaj +Vincas Razma +Vincent Bronner +Vincent Le Normand +Vincent Penquerc'h +Vincent Sanders +Vincent Torri +vitaha85 on github +Vlad Grachov +Vlad Ureche +Vladimir Grishchenko +Vladimir Kotal +Vladimir Lazarenko +Vlastimil OvÄáÄík +Vojtech Janota +Vojtech Minarik +VojtÄ›ch Král +Volker Schmid +Vsevolod Novikov +vshmuk on hackerone +W. Mark Kubacki +Waldek Kozba +Walter J. Mack +Ward Willats +Warren Menzer +Wayne Haigh +Wenchao Li +Wenxiang Qian +Werner Koch +wesinator on github +Wesley Laxton +Wesley Miaw +Wez Furlong +Wham Bang +Wilfredo Sanchez +Will Dietz +Willem Sparreboom +William A. Rowe Jr +William Ahern +wmsch on github +wncboy on github +Wojciech Zwiefka +Wouter Van Rooy +Wu Yongzheng +Wyatt O'Day +Xavier Bouchoux +XhstormR on github +Xiang Xiao +Xiangbin Li +Xiaoyin Liu +XmiliaH on github +Yaakov Selkowitz +Yang Tse +Yarram Sunil +Yasuharu Yamada +Yasuhiro Matsumoto +Yechiel Kalmenson +Yehezkel Horowitz +Yehoshua Hershberg +ygthien on github +Yi Huang +Yiming Jing +Yingwei Liu +Yonggang Luo +youngchopin on github +Yousuke Kimoto +Yu Xin +Yukihiro Kawada +Yun SangHo +Yuriy Sosov +Yves Arrouye +Yves Lejeune +Zachary Seguin +Zdenek Pavlas +Zekun Ni +zelinchen on github +Zenju on github +Zero King +Zhao Yisha +Zhaoyang Wu +Zhibiao Wu +Zhouyihai Ding +Zmey Petroff +Zvi Har'El +zzq1015 on github +Ä°smail Dönmez +Åukasz Domeradzki +Å tefan Kremeň +Ðикита Дорохин +加藤éƒä¹‹ diff --git a/docs/THANKS-filter b/docs/THANKS-filter new file mode 100644 index 0000000000..cabc939335 --- /dev/null +++ b/docs/THANKS-filter @@ -0,0 +1,101 @@ +# This is a list of names we have recorded that already are thanked +# appropriately in THANKS. This list contains variations of their names and +# their "canonical" name. This file is used for scripting purposes to avoid +# duplicate entries and will not be included in release tarballs. +# When removing dupes that aren't identical names from THANKS, add a line +# here! +# +# Used-by: contributor.sh +s/Andres Garcia/Andrés García/ +s/Chris Conroy/Christopher Conroy/ +s/Francois Charlier/François Charlier/ +s/Gokhan Sengun/Gökhan Åžengün/ +s/John Malmberg/John E. Malmberg/ +s/Luca Alteas/Luca Altea/ +s/Michal Gorny/MichaÅ‚ Górny/ +s/Michal Górny/MichaÅ‚ Górny/ +s/^Moonesamy$/S. Moonesamy/ +s/Pete Su$/Peter Su/ +s/Sam Listopad/Samuel Listopad/ +s/Sebastien Willemijns/Sébastien Willemijns/ +s/YAMADA Yasuharu/Yasuharu Yamada/ +s/Karl M$/Karl Moerder/ +s/Bjorn Stenberg/Björn Stenberg/ +s/upstream tests 305 and 404// +s/Gaël PORTAY/Gaël Portay/ +s/Romulo Ceccon/Romulo A. Ceccon/ +s/Nach M. S$/Nach M. S./ +s/Ja[yt] Satiro/Ray Satiro/ +s/Richard J. Moore/Richard Moore/ +s/Sergey Nikulov/Sergei Nikulov/ +s/Petr PísaÅ™/Petr Pisar/ +s/Nick Zitzmann (originally)/Nick Zitzmann/ +s/product-security at Apple// +s/IT DOES NOT WORK// +s/Albert Chin$/Albert Chin-A-Young/ +s/Paras S\z/Paras Sethia/ +s/Paras Sethiaethia/Paras Sethia/ +s/Дмитрий Фалько/Dmitry Falko/ +s/byte_bucket in the #curl IRC channel// +s/Michal Górny and Anthony G. Basile// +s/Alejandro Alvarez$/Alejandro Alvarez Ayllon/ +s/Ant Bryan/Anthony Bryan/ +s/CeÌdric Deltheil/Cédric Deltheil/ +s/Christian Hagele/Christian Hägele/ +s/douglas steinwand/Douglas Steinwand/ +s/Frank Van Uffelen and Fabian Hiernaux// +s/Rodrigo Silva (MestreLion)/Rodrigo Silva/ +s/tetetest tetetest// +s/Jiří HruÅ¡ka/Jiri Hruska/ +s/Viktor Szakáts/Viktor Szakats/ +s/Jonathan Cardoso$/Jonathan Cardoso Machado/ +s/Linus Nielsen$/Linus Nielsen Feltzing/ +s/Todd Ouska$/Todd A Ouska/ +s/Tim Ruehsen/Tim Rühsen/ +s/Michael Koenig/Michael König/ +s/moparisthebest/Travis Burtrum/ +s/Jan-E/Jan Ehrhardt/ +s/Paras S$/Paras Sethia/ +s/Cristian Rodr\xEDguez$/Cristian Rodríguez/ +s/Sidney San Mart\xEDn$/Sidney San Martín/ +s/Sidney San Martin$/Sidney San Martín/ +s/Taneli V\xE4h\xE4kangas$/Taneli Vähäkangas/ +s/Taneli Vahakangas$/Taneli Vähäkangas/ +s/Ðикита Дорохин./Ðикита Дорохин/ +s/upstream tests 305// +s/ (edited)// +s/Jean-Philippe Barette-LaPierre$/Jean-Philippe Barrette-LaPierre/ +s/Joern Hartroth$/Jörn Hartroth/ +s/Hongli Lai (Phusion)$/Hongli Lai/ +s/github user 'kreshano'$/kreshano on github/ +s/Marc Hoersken$/Marc Hörsken/ +s/Martin Storsjo$/Martin Storsjö/ +s/Jiri Malak$/Jiří Malák/ +s/JDepooter$/Joel Depooter/ +s/ERAMOTO Masaya$/Eramoto Masaya/ +s/shachaf on github$/Shachaf Ben-Kiki/ +s/CarloCannas on github$/Carlo Cannas/ +s/Henrik S. Gaßmann$/Henrik Gaßmann/ +s/moteus on github/Alexey Melnichuk/ +s/Rich Moore/Richard Moore/ +s/kdekker/Kees Dekker/ +s/Daniel Jelinski/Daniel JeliÅ„ski/ +s/Dario Weisser/Dario Weißer/ +s/Github user @jakirkham/jakirkham on github/ +s/Guenter Knauf/Gunter Knauf/ +s/Matteo B.$/Matteo Bignotti/ +s/Dan C$/Dan Cristian/ +s/Mark Eichin/Mark W. Eichin/ +s/Andreas Faerber/Andreas Farber/ +s/paulharris on github/Paul Harris/ +s/Warp Kawada/Yukihiro Kawada/ +s/Lau Hang Kin/Hang Kin Lau/ +s/Jonathan Cardoso Machado Machado/Jonathan Cardoso Machado/ +s/David Meyer/David J Meyer/ +s/Ramana Mokkapati/Venkataramana Mokkapati/ +s/wyattoday on github/Wyatt O'Day/ +s/Jason Priebe/Jason S. Priebe/ +s/Ale Vesely/Alessandro Vesely/ +s/Yamada Yasuharu/Yasuharu Yamada/ +s/Jim Gallagher/James Gallagher/ +s/Steve Brokenshire/Stephen Brokenshire/ diff --git a/docs/TODO b/docs/TODO new file mode 100644 index 0000000000..b288e4dbb4 --- /dev/null +++ b/docs/TODO @@ -0,0 +1,1186 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + Things that could be nice to do in the future + + Things to do in project curl. Please tell us what you think, contribute and + send us patches that improve things! + + Be aware that these are things that we could do, or have once been considered + things we could do. If you want to work on any of these areas, please + consider bringing it up for discussions first on the mailing list so that we + all agree it is still a good idea for the project! + + All bugs documented in the KNOWN_BUGS document are subject for fixing! + + 1. libcurl + 1.1 TFO support on Windows + 1.2 Consult %APPDATA% also for .netrc + 1.3 struct lifreq + 1.4 alt-svc sharing + 1.5 get rid of PATH_MAX + 1.7 Support HTTP/2 for HTTP(S) proxies + 1.8 CURLOPT_RESOLVE for any port number + 1.9 Cache negative name resolves + 1.10 auto-detect proxy + 1.11 minimize dependencies with dynamically loaded modules + 1.12 updated DNS server while running + 1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION + 1.14 Typesafe curl_easy_setopt() + 1.15 Monitor connections in the connection pool + 1.16 Try to URL encode given URL + 1.17 Add support for IRIs + 1.18 try next proxy if one doesn't work + 1.20 SRV and URI DNS records + 1.22 CURLINFO_PAUSE_STATE + 1.23 Offer API to flush the connection pool + 1.24 TCP Fast Open for windows + 1.25 Expose tried IP addresses that failed + 1.27 hardcode the "localhost" addresses + 1.28 FD_CLOEXEC + 1.29 Upgrade to websockets + 1.30 config file parsing + + 2. libcurl - multi interface + 2.1 More non-blocking + 2.2 Better support for same name resolves + 2.3 Non-blocking curl_multi_remove_handle() + 2.4 Split connect and authentication process + 2.5 Edge-triggered sockets should work + 2.6 multi upkeep + + 3. Documentation + 3.2 Provide cmake config-file + + 4. FTP + 4.1 HOST + 4.2 Alter passive/active on failure and retry + 4.3 Earlier bad letter detection + 4.5 ASCII support + 4.6 GSSAPI via Windows SSPI + 4.7 STAT for LIST without data connection + 4.8 Option to ignore private IP addresses in PASV response + + 5. HTTP + 5.1 Better persistency for HTTP 1.0 + 5.3 Rearrange request header order + 5.4 Allow SAN names in HTTP/2 server push + 5.5 auth= in URLs + + 6. TELNET + 6.1 ditch stdin + 6.2 ditch telnet-specific select + 6.3 feature negotiation debug data + + 7. SMTP + 7.2 Enhanced capability support + 7.3 Add CURLOPT_MAIL_CLIENT option + + 8. POP3 + 8.2 Enhanced capability support + + 9. IMAP + 9.1 Enhanced capability support + + 10. LDAP + 10.1 SASL based authentication mechanisms + 10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS + 10.3 Paged searches on LDAP server + + 11. SMB + 11.1 File listing support + 11.2 Honor file timestamps + 11.3 Use NTLMv2 + 11.4 Create remote directories + + 12. New protocols + + 13. SSL + 13.2 Provide mutex locking API + 13.3 Support in-memory certs/ca certs/keys + 13.4 Cache/share OpenSSL contexts + 13.5 Export session ids + 13.6 Provide callback for cert verification + 13.7 improve configure --with-ssl + 13.8 Support DANE + 13.10 Support Authority Information Access certificate extension (AIA) + 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY + 13.12 Support HSTS + 13.14 Support the clienthello extension + + 14. GnuTLS + 14.2 check connection + + 15. WinSSL/SChannel + 15.1 Add support for client certificate authentication + 15.3 Add support for the --ciphers option + 15.4 Add option to disable client certificate auto-send + + 16. SASL + 16.1 Other authentication mechanisms + 16.2 Add QOP support to GSSAPI authentication + 16.3 Support binary messages (i.e.: non-base64) + + 17. SSH protocols + 17.1 Multiplexing + 17.2 Handle growing SFTP files + 17.3 Support better than MD5 hostkey hash + 17.4 Support CURLOPT_PREQUOTE + + 18. Command line tool + 18.1 sync + 18.2 glob posts + 18.3 prevent file overwriting + 18.4 --proxycommand + 18.5 UTF-8 filenames in Content-Disposition + 18.7 at least N milliseconds between requests + 18.9 Choose the name of file in braces for complex URLs + 18.10 improve how curl works in a windows console window + 18.11 Windows: set attribute 'archive' for completed downloads + 18.12 keep running, read instructions from pipe/socket + 18.15 --retry should resume + 18.16 send only part of --data + 18.17 consider file name from the redirected URL with -O ? + 18.18 retry on network is unreachable + 18.19 expand ~/ in config files + 18.20 host name sections in config files + + 19. Build + 19.1 roffit + 19.2 Enable PIE and RELRO by default + 19.3 cmake test suite improvements + + 20. Test suite + 20.1 SSL tunnel + 20.2 nicer lacking perl message + 20.3 more protocols supported + 20.4 more platforms supported + 20.5 Add support for concurrent connections + 20.6 Use the RFC6265 test suite + 20.7 Support LD_PRELOAD on macOS + 20.8 Run web-platform-tests url tests + + 21. Next SONAME bump + 21.1 http-style HEAD output for FTP + 21.2 combine error codes + 21.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + 22. Next major release + 22.1 cleanup return codes + 22.2 remove obsolete defines + 22.3 size_t + 22.4 remove several functions + 22.5 remove CURLOPT_FAILONERROR + 22.7 remove progress meter from libcurl + 22.8 remove 'curl_httppost' from public + +============================================================================== + +1. libcurl + +1.1 TFO support on Windows + + TCP Fast Open is supported on several platforms but not on Windows. Work on + this was once started but never finished. + + See https://github.com/curl/curl/pull/3378 + +1.2 Consult %APPDATA% also for .netrc + + %APPDATA%\.netrc is not considered when running on Windows. Shouldn't it? + + See https://github.com/curl/curl/issues/4016 + +1.3 struct lifreq + + Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and + SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. + To support IPv6 interface addresses for network interfaces properly. + +1.4 alt-svc sharing + + The share interface could benefit from allowing the alt-svc cache to be + possible to share between easy handles. + + See https://github.com/curl/curl/issues/4476 + +1.5 get rid of PATH_MAX + + Having code use and rely on PATH_MAX is not nice: + https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html + + Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from + there we need libssh2 to properly tell us when we pass in a too small buffer + and its current API (as of libssh2 1.2.7) doesn't. + +1.7 Support HTTP/2 for HTTP(S) proxies + + Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing. + + See https://github.com/curl/curl/issues/3570 + +1.8 CURLOPT_RESOLVE for any port number + + This option allows applications to set a replacement IP address for a given + host + port pair. Consider making support for providing a replacement address + for the host name on all port numbers. + + See https://github.com/curl/curl/issues/1264 + +1.9 Cache negative name resolves + + A name resolve that has failed is likely to fail when made again within a + short period of time. Currently we only cache positive responses. + +1.10 auto-detect proxy + + libcurl could be made to detect the system proxy setup automatically and use + that. On Windows, macOS and Linux desktops for example. + + The pull-request to use libproxy for this was deferred due to doubts on the + reliability of the dependency and how to use it: + https://github.com/curl/curl/pull/977 + + libdetectproxy is a (C++) library for detecting the proxy on Windows + https://github.com/paulharris/libdetectproxy + +1.11 minimize dependencies with dynamically loaded modules + + We can create a system with loadable modules/plug-ins, where these modules + would be the ones that link to 3rd party libs. That would allow us to avoid + having to load ALL dependencies since only the necessary ones for this + app/invoke/used protocols would be necessary to load. See + https://github.com/curl/curl/issues/349 + +1.12 updated DNS server while running + + If /etc/resolv.conf gets updated while a program using libcurl is running, it + is may cause name resolves to fail unless res_init() is called. We should + consider calling res_init() + retry once unconditionally on all name resolve + failures to mitigate against this. Firefox works like that. Note that Windows + doesn't have res_init() or an alternative. + + https://github.com/curl/curl/issues/2251 + +1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION + + curl will create most sockets via the CURLOPT_OPENSOCKETFUNCTION callback and + close them with the CURLOPT_CLOSESOCKETFUNCTION callback. However, c-ares + does not use those functions and instead opens and closes the sockets + itself. This means that when curl passes the c-ares socket to the + CURLMOPT_SOCKETFUNCTION it isn't owned by the application like other sockets. + + See https://github.com/curl/curl/issues/2734 + +1.14 Typesafe curl_easy_setopt() + + One of the most common problems in libcurl using applications is the lack of + type checks for curl_easy_setopt() which happens because it accepts varargs + and thus can take any type. + + One possible solution to this is to introduce a few different versions of the + setopt version for the different kinds of data you can set. + + curl_easy_set_num() - sets a long value + + curl_easy_set_large() - sets a curl_off_t value + + curl_easy_set_ptr() - sets a pointer + + curl_easy_set_cb() - sets a callback PLUS its callback data + +1.15 Monitor connections in the connection pool + + libcurl's connection cache or pool holds a number of open connections for the + purpose of possible subsequent connection reuse. It may contain a few up to a + significant amount of connections. Currently, libcurl leaves all connections + as they are and first when a connection is iterated over for matching or + reuse purpose it is verified that it is still alive. + + Those connections may get closed by the server side for idleness or they may + get a HTTP/2 ping from the peer to verify that they're still alive. By adding + monitoring of the connections while in the pool, libcurl can detect dead + connections (and close them) better and earlier, and it can handle HTTP/2 + pings to keep such ones alive even when not actively doing transfers on them. + +1.16 Try to URL encode given URL + + Given a URL that for example contains spaces, libcurl could have an option + that would try somewhat harder than it does now and convert spaces to %20 and + perhaps URL encoded byte values over 128 etc (basically do what the redirect + following code already does). + + https://github.com/curl/curl/issues/514 + +1.17 Add support for IRIs + + IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly + support this, curl/libcurl would need to translate/encode the given input + from the input string encoding into percent encoded output "over the wire". + + To make that work smoothly for curl users even on Windows, curl would + probably need to be able to convert from several input encodings. + +1.18 try next proxy if one doesn't work + + Allow an application to specify a list of proxies to try, and failing to + connect to the first go on and try the next instead until the list is + exhausted. Browsers support this feature at least when they specify proxies + using PACs. + + https://github.com/curl/curl/issues/896 + +1.20 SRV and URI DNS records + + Offer support for resolving SRV and URI DNS records for libcurl to know which + server to connect to for various protocols (including HTTP!). + +1.22 CURLINFO_PAUSE_STATE + + Return information about the transfer's current pause state, in both + directions. https://github.com/curl/curl/issues/2588 + +1.23 Offer API to flush the connection pool + + Sometimes applications want to flush all the existing connections kept alive. + An API could allow a forced flush or just a forced loop that would properly + close all connections that have been closed by the server already. + +1.24 TCP Fast Open for windows + + libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and + Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607 + and we should add support for it. + +1.25 Expose tried IP addresses that failed + + When libcurl fails to connect to a host, it should be able to offer the + application the list of IP addresses that were used in the attempt. + + https://github.com/curl/curl/issues/2126 + +1.27 hardcode the "localhost" addresses + + There's this new spec getting adopted that says "localhost" should always and + unconditionally be a local address and not get resolved by a DNS server. A + fine way for curl to fix this would be to simply hard-code the response to + 127.0.0.1 and/or ::1 (depending on what IP versions that are requested). This + is what the browsers probably will do with this hostname. + + https://bugzilla.mozilla.org/show_bug.cgi?id=1220810 + + https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02 + +1.28 FD_CLOEXEC + + It sets the close-on-exec flag for the file descriptor, which causes the file + descriptor to be automatically (and atomically) closed when any of the + exec-family functions succeed. Should probably be set by default? + + https://github.com/curl/curl/issues/2252 + +1.29 Upgrade to websockets + + libcurl could offer a smoother path to get to a websocket connection. + See https://github.com/curl/curl/issues/3523 + + Michael Kaufmann suggestion here: + https://curl.haxx.se/video/curlup-2017/2017-03-19_05_Michael_Kaufmann_Websocket_support_for_curl.mp4 + +1.30 config file parsing + + Consider providing an API, possibly in a separate companion library, for + parsing a config file like curl's -K/--config option to allow applications to + get the same ability to read curl options from files. + + See https://github.com/curl/curl/issues/3698 + +2. libcurl - multi interface + +2.1 More non-blocking + + Make sure we don't ever loop because of non-blocking sockets returning + EWOULDBLOCK or similar. Blocking cases include: + + - Name resolves on non-windows unless c-ares or the threaded resolver is used + - file:// transfers + - TELNET transfers + - The "DONE" operation (post transfer protocol-specific actions) for the + protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task. + +2.2 Better support for same name resolves + + If a name resolve has been initiated for name NN and a second easy handle + wants to resolve that name as well, make it wait for the first resolve to end + up in the cache instead of doing a second separate resolve. This is + especially needed when adding many simultaneous handles using the same host + name when the DNS resolver can get flooded. + +2.3 Non-blocking curl_multi_remove_handle() + + The multi interface has a few API calls that assume a blocking behavior, like + add_handle() and remove_handle() which limits what we can do internally. The + multi API need to be moved even more into a single function that "drives" + everything in a non-blocking manner and signals when something is done. A + remove or add would then only ask for the action to get started and then + multi_perform() etc still be called until the add/remove is completed. + +2.4 Split connect and authentication process + + The multi interface treats the authentication process as part of the connect + phase. As such any failures during authentication won't trigger the relevant + QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP. + +2.5 Edge-triggered sockets should work + + The multi_socket API should work with edge-triggered socket events. One of + the internal actions that need to be improved for this to work perfectly is + the 'maxloops' handling in transfer.c:readwrite_data(). + +2.6 multi upkeep + + In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works + on easy handles. We should introduces a version of that for the multi handle, + and also consider doing "upkeep" automatically on connections in the + connection pool when the multi handle is in used. + + See https://github.com/curl/curl/issues/3199 + +3. Documentation + +3.2 Provide cmake config-file + + A config-file package is a set of files provided by us to allow applications + to write cmake scripts to find and use libcurl easier. See + https://github.com/curl/curl/issues/885 + +4. FTP + +4.1 HOST + + HOST is a command for a client to tell which host name to use, to offer FTP + servers named-based virtual hosting: + + https://tools.ietf.org/html/rfc7151 + +4.2 Alter passive/active on failure and retry + + When trying to connect passively to a server which only supports active + connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the + connection. There could be a way to fallback to an active connection (and + vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793 + +4.3 Earlier bad letter detection + + Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the + process to avoid doing a resolve and connect in vain. + +4.5 ASCII support + + FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly. + +4.6 GSSAPI via Windows SSPI + + In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5) + via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add + support for GSSAPI authentication via Windows SSPI. + +4.7 STAT for LIST without data connection + + Some FTP servers allow STAT for listing directories instead of using LIST, + and the response is then sent over the control connection instead of as the + otherwise usedw data connection: https://www.nsftools.com/tips/RawFTP.htm#STAT + + This is not detailed in any FTP specification. + +4.8 Option to ignore private IP addresses in PASV response + + Some servers respond with and some other FTP client implementations can + ignore private (RFC 1918 style) IP addresses when received in PASV responses. + To consider for libcurl as well. See https://github.com/curl/curl/issues/1455 + +5. HTTP + +5.1 Better persistency for HTTP 1.0 + + "Better" support for persistent connections over HTTP 1.0 + https://curl.haxx.se/bug/feature.cgi?id=1089001 + +5.3 Rearrange request header order + + Server implementors often make an effort to detect browser and to reject + clients it can detect to not match. One of the last details we cannot yet + control in libcurl's HTTP requests, which also can be exploited to detect + that libcurl is in fact used even when it tries to impersonate a browser, is + the order of the request headers. I propose that we introduce a new option in + which you give headers a value, and then when the HTTP request is built it + sorts the headers based on that number. We could then have internally created + headers use a default value so only headers that need to be moved have to be + specified. + +5.4 Allow SAN names in HTTP/2 server push + + curl only allows HTTP/2 push promise if the provided :authority header value + exactly matches the host name given in the URL. It could be extended to allow + any name that would match the Subject Alternative Names in the server's TLS + certificate. + + See https://github.com/curl/curl/pull/3581 + +5.5 auth= in URLs + + Add the ability to specify the preferred authentication mechanism to use by + using ;auth= in the login part of the URL. + + For example: + + http://test:pass;auth=NTLM@example.com would be equivalent to specifying + --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line. + + Additionally this should be implemented for proxy base URLs as well. + + +6. TELNET + +6.1 ditch stdin + + Reading input (to send to the remote server) on stdin is a crappy solution + for library purposes. We need to invent a good way for the application to be + able to provide the data to send. + +6.2 ditch telnet-specific select + + Move the telnet support's network select() loop go away and merge the code + into the main transfer loop. Until this is done, the multi interface won't + work for telnet. + +6.3 feature negotiation debug data + + Add telnet feature negotiation data to the debug callback as header data. + + +7. SMTP + +7.2 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the EHLO command. + +7.3 Add CURLOPT_MAIL_CLIENT option + + Rather than use the URL to specify the mail client string to present in the + HELO and EHLO commands, libcurl should support a new CURLOPT specifically for + specifying this data as the URL is non-standard and to be honest a bit of a + hack ;-) + + Please see the following thread for more information: + https://curl.haxx.se/mail/lib-2012-05/0178.html + + +8. POP3 + +8.2 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the CAPA command. + +9. IMAP + +9.1 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the CAPABILITY command. + +10. LDAP + +10.1 SASL based authentication mechanisms + + Currently the LDAP module only supports ldap_simple_bind_s() in order to bind + to an LDAP server. However, this function sends username and password details + using the simple authentication mechanism (as clear text). However, it should + be possible to use ldap_bind_s() instead specifying the security context + information ourselves. + +10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS + + CURLOPT_SSL_CTX_FUNCTION works perfectly for HTTPS and email protocols, but + it has no effect for LDAPS connections. + + https://github.com/curl/curl/issues/4108 + +10.3 Paged searches on LDAP server + + https://github.com/curl/curl/issues/4452 + +11. SMB + +11.1 File listing support + +Add support for listing the contents of a SMB share. The output should probably +be the same as/similar to FTP. + +11.2 Honor file timestamps + +The timestamp of the transferred file should reflect that of the original file. + +11.3 Use NTLMv2 + +Currently the SMB authentication uses NTLMv1. + +11.4 Create remote directories + +Support for creating remote directories when uploading a file to a directory +that doesn't exist on the server, just like --ftp-create-dirs. + +12. New protocols + +13. SSL + +13.2 Provide mutex locking API + + Provide a libcurl API for setting mutex callbacks in the underlying SSL + library, so that the same application code can use mutex-locking + independently of OpenSSL or GnutTLS being used. + +13.3 Support in-memory certs/ca certs/keys + + You can specify the private and public keys for SSH/SSL as file paths. Some + programs want to avoid using files and instead just pass them as in-memory + data blobs. There's probably a challenge to make this work across the + plethory of different TLS and SSH backends that curl supports. + https://github.com/curl/curl/issues/2310 + +13.4 Cache/share OpenSSL contexts + + "Look at SSL cafile - quick traces look to me like these are done on every + request as well, when they should only be necessary once per SSL context (or + once per handle)". The major improvement we can rather easily do is to make + sure we don't create and kill a new SSL "context" for every request, but + instead make one for every connection and re-use that SSL context in the same + style connections are re-used. It will make us use slightly more memory but + it will libcurl do less creations and deletions of SSL contexts. + + Technically, the "caching" is probably best implemented by getting added to + the share interface so that easy handles who want to and can reuse the + context specify that by sharing with the right properties set. + + https://github.com/curl/curl/issues/1110 + +13.5 Export session ids + + Add an interface to libcurl that enables "session IDs" to get + exported/imported. Cris Bailiff said: "OpenSSL has functions which can + serialise the current SSL state to a buffer of your choice, and recover/reset + the state from such a buffer at a later date - this is used by mod_ssl for + apache to implement and SSL session ID cache". + +13.6 Provide callback for cert verification + + OpenSSL supports a callback for customised verification of the peer + certificate, but this doesn't seem to be exposed in the libcurl APIs. Could + it be? There's so much that could be done if it were! + +13.7 improve configure --with-ssl + + make the configure --with-ssl option first check for OpenSSL, then GnuTLS, + then NSS... + +13.8 Support DANE + + DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL + keys and certs over DNS using DNSSEC as an alternative to the CA model. + https://www.rfc-editor.org/rfc/rfc6698.txt + + An initial patch was posted by Suresh Krishnaswamy on March 7th 2013 + (https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple + approach. See Daniel's comments: + https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the + correct library to base this development on. + + Björn Stenberg wrote a separate initial take on DANE that was never + completed. + +13.10 Support Authority Information Access certificate extension (AIA) + + AIA can provide various things like CRLs but more importantly information + about intermediate CA certificates that can allow validation path to be + fulfilled when the HTTPS server doesn't itself provide them. + + Since AIA is about downloading certs on demand to complete a TLS handshake, + it is probably a bit tricky to get done right. + + See https://github.com/curl/curl/issues/2793 + +13.11 Support intermediate & root pinning for PINNEDPUBLICKEY + + CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root + certificates when comparing the pinned keys. Therefore it is not compatible + with "HTTP Public Key Pinning" as there also intermediate and root certificates + can be pinned. This is very useful as it prevents webadmins from "locking + themself out of their servers". + + Adding this feature would make curls pinning 100% compatible to HPKP and allow + more flexible pinning. + +13.12 Support HSTS + + "HTTP Strict Transport Security" is TOFU (trust on first use), time-based + features indicated by a HTTP header send by the webserver. It is widely used + in browsers and it's purpose is to prevent insecure HTTP connections after + a previous HTTPS connection. It protects against SSLStripping attacks. + + Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security + RFC 6797: https://tools.ietf.org/html/rfc6797 + +13.14 Support the clienthello extension + + Certain stupid networks and middle boxes have a problem with SSL handshake + pakets that are within a certain size range because how that sets some bits + that previously (in older TLS version) were not set. The clienthello + extension adds padding to avoid that size range. + + https://tools.ietf.org/html/rfc7685 + https://github.com/curl/curl/issues/2299 + +14. GnuTLS + +14.2 check connection + + Add a way to check if the connection seems to be alive, to correspond to the + SSL_peak() way we use with OpenSSL. + +15. WinSSL/SChannel + +15.1 Add support for client certificate authentication + + WinSSL/SChannel currently makes use of the OS-level system and user + certificate and private key stores. This does not allow the application + or the user to supply a custom client certificate using curl or libcurl. + + Therefore support for the existing -E/--cert and --key options should be + implemented by supplying a custom certificate to the SChannel APIs, see: + - Getting a Certificate for Schannel + https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx + +15.3 Add support for the --ciphers option + + The cipher suites used by WinSSL/SChannel are configured on an OS-level + instead of an application-level. This does not allow the application or + the user to customize the configured cipher suites using curl or libcurl. + + Therefore support for the existing --ciphers option should be implemented + by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see + - Specifying Schannel Ciphers and Cipher Strengths + https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx + +15.4 Add option to disable client certificate auto-send + + Microsoft says "By default, Schannel will, with no notification to the client, + attempt to locate a client certificate and send it to the server." That could + be considered a privacy violation and unexpected. + + Some Windows users have come to expect that default behavior and to change the + default to make it consistent with other SSL backends would be a breaking + change. An option should be added that can be used to disable the default + Schannel auto-send behavior. + + https://github.com/curl/curl/issues/2262 + +16. SASL + +16.1 Other authentication mechanisms + + Add support for other authentication mechanisms such as OLP, + GSS-SPNEGO and others. + +16.2 Add QOP support to GSSAPI authentication + + Currently the GSSAPI authentication only supports the default QOP of auth + (Authentication), whilst Kerberos V5 supports both auth-int (Authentication + with integrity protection) and auth-conf (Authentication with integrity and + privacy protection). + +16.3 Support binary messages (i.e.: non-base64) + + Mandatory to support LDAP SASL authentication. + + +17. SSH protocols + +17.1 Multiplexing + + SSH is a perfectly fine multiplexed protocols which would allow libcurl to do + multiple parallel transfers from the same host using the same connection, + much in the same spirit as HTTP/2 does. libcurl however does not take + advantage of that ability but will instead always create a new connection for + new transfers even if an existing connection already exists to the host. + + To fix this, libcurl would have to detect an existing connection and "attach" + the new transfer to the existing one. + +17.2 Handle growing SFTP files + + The SFTP code in libcurl checks the file size *before* a transfer starts and + then proceeds to transfer exactly that amount of data. If the remote file + grows while the transfer is in progress libcurl won't notice and will not + adapt. The OpenSSH SFTP command line tool does and libcurl could also just + attempt to download more to see if there is more to get... + + https://github.com/curl/curl/issues/4344 + +17.3 Support better than MD5 hostkey hash + + libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the + server's key. MD5 is generally being deprecated so we should implement + support for stronger hashing algorithms. libssh2 itself is what provides this + underlying functionality and it supports at least SHA-1 as an alternative. + SHA-1 is also being deprecated these days so we should consider working with + libssh2 to instead offer support for SHA-256 or similar. + +17.4 Support CURLOPT_PREQUOTE + + The two other QUOTE options are supported for SFTP, but this was left out for + unknown reasons! + +18. Command line tool + +18.1 sync + + "curl --sync http://example.com/feed[1-100].rss" or + "curl --sync http://example.net/{index,calendar,history}.html" + + Downloads a range or set of URLs using the remote name, but only if the + remote file is newer than the local file. A Last-Modified HTTP date header + should also be used to set the mod date on the downloaded file. + +18.2 glob posts + + Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. + This is easily scripted though. + +18.3 prevent file overwriting + + Add an option that prevents curl from overwriting existing local files. When + used, and there already is an existing file with the target file name + (either -O or -o), a number should be appended (and increased if already + existing). So that index.html becomes first index.html.1 and then + index.html.2 etc. + +18.4 --proxycommand + + Allow the user to make curl run a command and use its stdio to make requests + and not do any network connection by itself. Example: + + curl --proxycommand 'ssh pi@raspberrypi.local -W 10.1.1.75 80' \ + http://some/otherwise/unavailable/service.php + + See https://github.com/curl/curl/issues/4941 + +18.5 UTF-8 filenames in Content-Disposition + + RFC 6266 documents how UTF-8 names can be passed to a client in the + Content-Disposition header, and curl does not support this. + + https://github.com/curl/curl/issues/1888 + +18.7 at least N milliseconds between requests + + Allow curl command lines issue a lot of request against services that limit + users to no more than N requests/second or similar. Could be implemented with + an option asking that at least a certain time has elapsed since the previous + request before the next one will be performed. Example: + + $ curl "https://example.com/api?input=[1-1000]" -d yadayada --after 500 + + See https://github.com/curl/curl/issues/3920 + +18.9 Choose the name of file in braces for complex URLs + + When using braces to download a list of URLs and you use complicated names + in the list of alternatives, it could be handy to allow curl to use other + names when saving. + + Consider a way to offer that. Possibly like + {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the + colon is the output name. + + See https://github.com/curl/curl/issues/221 + +18.10 improve how curl works in a windows console window + + If you pull the scrollbar when transferring with curl in a Windows console + window, the transfer is interrupted and can get disconnected. This can + probably be improved. See https://github.com/curl/curl/issues/322 + +18.11 Windows: set attribute 'archive' for completed downloads + + The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be + backed up from those that are either not ready or have not changed. + + Downloads in progress are neither ready to be backed up, nor should they be + opened by a different process. Only after a download has been completed it's + sensible to include it in any integer snapshot or backup of the system. + + See https://github.com/curl/curl/issues/3354 + +18.12 keep running, read instructions from pipe/socket + + Provide an option that makes curl not exit after the last URL (or even work + without a given URL), and then make it read instructions passed on a pipe or + over a socket to make further instructions so that a second subsequent curl + invoke can talk to the still running instance and ask for transfers to get + done, and thus maintain its connection pool, DNS cache and more. + +18.15 --retry should resume + + When --retry is used and curl actually retries transfer, it should use the + already transferred data and do a resumed transfer for the rest (when + possible) so that it doesn't have to transfer the same data again that was + already transferred before the retry. + + See https://github.com/curl/curl/issues/1084 + +18.16 send only part of --data + + When the user only wants to send a small piece of the data provided with + --data or --data-binary, like when that data is a huge file, consider a way + to specify that curl should only send a piece of that. One suggested syntax + would be: "--data-binary @largefile.zip!1073741823-2147483647". + + See https://github.com/curl/curl/issues/1200 + +18.17 consider file name from the redirected URL with -O ? + + When a user gives a URL and uses -O, and curl follows a redirect to a new + URL, the file name is not extracted and used from the newly redirected-to URL + even if the new URL may have a much more sensible file name. + + This is clearly documented and helps for security since there's no surprise + to users which file name that might get overwritten. But maybe a new option + could allow for this or maybe -J should imply such a treatment as well as -J + already allows for the server to decide what file name to use so it already + provides the "may overwrite any file" risk. + + This is extra tricky if the original URL has no file name part at all since + then the current code path will error out with an error message, and we can't + *know* already at that point if curl will be redirected to a URL that has a + file name... + + See https://github.com/curl/curl/issues/1241 + +18.18 retry on network is unreachable + + The --retry option retries transfers on "transient failures". We later added + --retry-connrefused to also retry for "connection refused" errors. + + Suggestions have been brought to also allow retry on "network is unreachable" + errors and while totally reasonable, maybe we should consider a way to make + this more configurable than to add a new option for every new error people + want to retry for? + + https://github.com/curl/curl/issues/1603 + +18.19 expand ~/ in config files + + For example .curlrc could benefit from being able to do this. + + See https://github.com/curl/curl/issues/2317 + +18.20 host name sections in config files + + config files would be more powerful if they could set different + configurations depending on used URLs, host name or possibly origin. Then a + default .curlrc could a specific user-agent only when doing requests against + a certain site. + + +19. Build + +19.1 roffit + + Consider extending 'roffit' to produce decent ASCII output, and use that + instead of (g)nroff when building src/tool_hugehelp.c + +19.2 Enable PIE and RELRO by default + + Especially when having programs that execute curl via the command line, PIE + renders the exploitation of memory corruption vulnerabilities a lot more + difficult. This can be attributed to the additional information leaks being + required to conduct a successful attack. RELRO, on the other hand, masks + different binary sections like the GOT as read-only and thus kills a handful + of techniques that come in handy when attackers are able to arbitrarily + overwrite memory. A few tests showed that enabling these features had close + to no impact, neither on the performance nor on the general functionality of + curl. + +19.3 cmake test suite improvements + + The cmake build doesn't support 'make show' so it doesn't know which tests + are in the makefile or not (making appveyor builds do many false warnings + about it) nor does it support running the test suite if building out-of-tree. + + See https://github.com/curl/curl/issues/3109 + +20. Test suite + +20.1 SSL tunnel + + Make our own version of stunnel for simple port forwarding to enable HTTPS + and FTP-SSL tests without the stunnel dependency, and it could allow us to + provide test tools built with either OpenSSL or GnuTLS + +20.2 nicer lacking perl message + + If perl wasn't found by the configure script, don't attempt to run the tests + but explain something nice why it doesn't. + +20.3 more protocols supported + + Extend the test suite to include more protocols. The telnet could just do FTP + or http operations (for which we have test servers). + +20.4 more platforms supported + + Make the test suite work on more platforms. OpenBSD and Mac OS. Remove + fork()s and it should become even more portable. + +20.5 Add support for concurrent connections + + Tests 836, 882 and 938 were designed to verify that separate connections + aren't used when using different login credentials in protocols that + shouldn't re-use a connection under such circumstances. + + Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent + connections. The read while() loop seems to loop until it receives a + disconnect from the client, where it then enters the waiting for connections + loop. When the client opens a second connection to the server, the first + connection hasn't been dropped (unless it has been forced - which we + shouldn't do in these tests) and thus the wait for connections loop is never + entered to receive the second connection. + +20.6 Use the RFC6265 test suite + + A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at + https://github.com/abarth/http-state/tree/master/tests + + It'd be really awesome if someone would write a script/setup that would run + curl with that test suite and detect deviances. Ideally, that would even be + incorporated into our regular test suite. + +20.7 Support LD_PRELOAD on macOS + + LD_RELOAD doesn't work on macOS, but there are tests which require it to run + properly. Look into making the preload support in runtests.pl portable such + that it uses DYLD_INSERT_LIBRARIES on macOS. + +20.8 Run web-platform-tests url tests + + Run web-platform-tests url tests and compare results with browsers on wpt.fyi + + It would help us find issues to fix and help us document where our parser + differs from the WHATWG URL spec parsers. + + See https://github.com/curl/curl/issues/4477 + +21. Next SONAME bump + +21.1 http-style HEAD output for FTP + + #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers + from being output in NOBODY requests over FTP + +21.2 combine error codes + + Combine some of the error codes to remove duplicates. The original + numbering should not be changed, and the old identifiers would be + macroed to the new ones in an CURL_NO_OLDIES section to help with + backward compatibility. + + Candidates for removal and their replacements: + + CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR + + CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT + + CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT + + CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL + + CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED + +21.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + The current prototype only provides 'purpose' that tells what the + connection/socket is for, but not any protocol or similar. It makes it hard + for applications to differentiate on TCP vs UDP and even HTTP vs FTP and + similar. + +22. Next major release + +22.1 cleanup return codes + + curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a + CURLMcode. These should be changed to be the same. + +22.2 remove obsolete defines + + remove obsolete defines from curl/curl.h + +22.3 size_t + + make several functions use size_t instead of int in their APIs + +22.4 remove several functions + + remove the following functions from the public API: + + curl_getenv + + curl_mprintf (and variations) + + curl_strequal + + curl_strnequal + + They will instead become curlx_ - alternatives. That makes the curl app + still capable of using them, by building with them from source. + + These functions have no purpose anymore: + + curl_multi_socket + + curl_multi_socket_all + +22.5 remove CURLOPT_FAILONERROR + + Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird + internally. Let the app judge success or not for itself. + +22.7 remove progress meter from libcurl + + The internally provided progress meter output doesn't belong in the library. + Basically no application wants it (apart from curl) but instead applications + can and should do their own progress meters using the progress callback. + + The progress callback should then be bumped as well to get proper 64bit + variable types passed to it instead of doubles so that big files work + correctly. + +22.8 remove 'curl_httppost' from public + + curl_formadd() was made to fill in a public struct, but the fact that the + struct is public is never really used by application for their own advantage + but instead often restricts how the form functions can or can't be modified. + + Changing them to return a private handle will benefit the implementation and + allow us much greater freedoms while still maintaining a solid API and ABI. diff --git a/docs/TheArtOfHttpScripting b/docs/TheArtOfHttpScripting new file mode 100644 index 0000000000..c5b67ca1b5 --- /dev/null +++ b/docs/TheArtOfHttpScripting @@ -0,0 +1,758 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +The Art Of Scripting HTTP Requests Using Curl + + 1. HTTP Scripting + 1.1 Background + 1.2 The HTTP Protocol + 1.3 See the Protocol + 1.4 See the Timing + 1.5 See the Response + 2. URL + 2.1 Spec + 2.2 Host + 2.3 Port number + 2.4 User name and password + 2.5 Path part + 3. Fetch a page + 3.1 GET + 3.2 HEAD + 3.3 Multiple URLs in a single command line + 3.4 Multiple HTTP methods in a single command line + 4. HTML forms + 4.1 Forms explained + 4.2 GET + 4.3 POST + 4.4 File Upload POST + 4.5 Hidden Fields + 4.6 Figure Out What A POST Looks Like + 5. HTTP upload + 5.1 PUT + 6. HTTP Authentication + 6.1 Basic Authentication + 6.2 Other Authentication + 6.3 Proxy Authentication + 6.4 Hiding credentials + 7. More HTTP Headers + 7.1 Referer + 7.2 User Agent + 8. Redirects + 8.1 Location header + 8.2 Other redirects + 9. Cookies + 9.1 Cookie Basics + 9.2 Cookie options + 10. HTTPS + 10.1 HTTPS is HTTP secure + 10.2 Certificates + 11. Custom Request Elements + 11.1 Modify method and headers + 11.2 More on changed methods + 12. Web Login + 12.1 Some login tricks + 13. Debug + 13.1 Some debug tricks + 14. References + 14.1 Standards + 14.2 Sites + +============================================================================== + +1. HTTP Scripting + + 1.1 Background + + This document assumes that you're familiar with HTML and general networking. + + The increasing amount of applications moving to the web has made "HTTP + Scripting" more frequently requested and wanted. To be able to automatically + extract information from the web, to fake users, to post or upload data to + web servers are all important tasks today. + + Curl is a command line tool for doing all sorts of URL manipulations and + transfers, but this particular document will focus on how to use it when + doing HTTP requests for fun and profit. I'll assume that you know how to + invoke 'curl --help' or 'curl --manual' to get basic information about it. + + Curl is not written to do everything for you. It makes the requests, it gets + the data, it sends data and it retrieves the information. You probably need + to glue everything together using some kind of script language or repeated + manual invokes. + + 1.2 The HTTP Protocol + + HTTP is the protocol used to fetch data from web servers. It is a very simple + protocol that is built upon TCP/IP. The protocol also allows information to + get sent to the server from the client using a few different methods, as will + be shown here. + + HTTP is plain ASCII text lines being sent by the client to a server to + request a particular action, and then the server replies a few text lines + before the actual requested content is sent to the client. + + The client, curl, sends a HTTP request. The request contains a method (like + GET, POST, HEAD etc), a number of request headers and sometimes a request + body. The HTTP server responds with a status line (indicating if things went + well), response headers and most often also a response body. The "body" part + is the plain data you requested, like the actual HTML or the image etc. + + 1.3 See the Protocol + + Using curl's option --verbose (-v as a short option) will display what kind + of commands curl sends to the server, as well as a few other informational + texts. + + --verbose is the single most useful option when it comes to debug or even + understand the curl<->server interaction. + + Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer + even more details as they show EVERYTHING curl sends and receives. Use it + like this: + + curl --trace-ascii debugdump.txt http://www.example.com/ + + 1.4 See the Timing + + Many times you may wonder what exactly is taking all the time, or you just + want to know the amount of milliseconds between two points in a + transfer. For those, and other similar situations, the --trace-time option + is what you need. It'll prepend the time to each trace output line: + + curl --trace-ascii d.txt --trace-time http://example.com/ + + 1.5 See the Response + + By default curl sends the response to stdout. You need to redirect it + somewhere to avoid that, most often that is done with -o or -O. + +2. URL + + 2.1 Spec + + The Uniform Resource Locator format is how you specify the address of a + particular resource on the Internet. You know these, you've seen URLs like + https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the + canonical spec. And yeah, the formal name is not URL, it is URI. + + 2.2 Host + + The host name is usually resolved using DNS or your /etc/hosts file to an IP + address and that's what curl will communicate with. Alternatively you specify + the IP address directly in the URL instead of a name. + + For development and other trying out situations, you can point to a different + IP address for a host name than what would otherwise be used, by using curl's + --resolve option: + + curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/ + + 2.3 Port number + + Each protocol curl supports operates on a default port number, be it over TCP + or in some cases UDP. Normally you don't have to take that into + consideration, but at times you run test servers on other ports or + similar. Then you can specify the port number in the URL with a colon and a + number immediately following the host name. Like when doing HTTP to port + 1234: + + curl http://www.example.org:1234/ + + The port number you specify in the URL is the number that the server uses to + offer its services. Sometimes you may use a local proxy, and then you may + need to specify that proxy's port number separately for what curl needs to + connect to locally. Like when using a HTTP proxy on port 4321: + + curl --proxy http://proxy.example.org:4321 http://remote.example.org/ + + 2.4 User name and password + + Some services are setup to require HTTP authentication and then you need to + provide name and password which is then transferred to the remote site in + various ways depending on the exact authentication protocol used. + + You can opt to either insert the user and password in the URL or you can + provide them separately: + + curl http://user:password@example.org/ + + or + + curl -u user:password http://example.org/ + + You need to pay attention that this kind of HTTP authentication is not what + is usually done and requested by user-oriented web sites these days. They + tend to use forms and cookies instead. + + 2.5 Path part + + The path part is just sent off to the server to request that it sends back + the associated response. The path is what is to the right side of the slash + that follows the host name and possibly port number. + +3. Fetch a page + + 3.1 GET + + The simplest and most common request/operation made using HTTP is to GET a + URL. The URL could itself refer to a web page, an image or a file. The client + issues a GET request to the server and receives the document it asked for. + If you issue the command line + + curl https://curl.haxx.se + + you get a web page returned in your terminal window. The entire HTML document + that that URL holds. + + All HTTP replies contain a set of response headers that are normally hidden, + use curl's --include (-i) option to display them as well as the rest of the + document. + + 3.2 HEAD + + You can ask the remote server for ONLY the headers by using the --head (-I) + option which will make curl issue a HEAD request. In some special cases + servers deny the HEAD method while others still work, which is a particular + kind of annoyance. + + The HEAD method is defined and made so that the server returns the headers + exactly the way it would do for a GET, but without a body. It means that you + may see a Content-Length: in the response headers, but there must not be an + actual body in the HEAD response. + + 3.3 Multiple URLs in a single command line + + A single curl command line may involve one or many URLs. The most common case + is probably to just use one, but you can specify any amount of URLs. Yes + any. No limits. You'll then get requests repeated over and over for all the + given URLs. + + Example, send two GETs: + + curl http://url1.example.com http://url2.example.com + + If you use --data to POST to the URL, using multiple URLs means that you send + that same POST to all the given URLs. + + Example, send two POSTs: + + curl --data name=curl http://url1.example.com http://url2.example.com + + + 3.4 Multiple HTTP methods in a single command line + + Sometimes you need to operate on several URLs in a single command line and do + different HTTP methods on each. For this, you'll enjoy the --next option. It + is basically a separator that separates a bunch of options from the next. All + the URLs before --next will get the same method and will get all the POST + data merged into one. + + When curl reaches the --next on the command line, it'll sort of reset the + method and the POST data and allow a new set. + + Perhaps this is best shown with a few examples. To send first a HEAD and then + a GET: + + curl -I http://example.com --next http://example.com + + To first send a POST and then a GET: + + curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html + + +4. HTML forms + + 4.1 Forms explained + + Forms are the general way a web site can present a HTML page with fields for + the user to enter data in, and then press some kind of 'OK' or 'Submit' + button to get that data sent to the server. The server then typically uses + the posted data to decide how to act. Like using the entered words to search + in a database, or to add the info in a bug tracking system, display the entered + address on a map or using the info as a login-prompt verifying that the user + is allowed to see what it is about to see. + + Of course there has to be some kind of program on the server end to receive + the data you send. You cannot just invent something out of the air. + + 4.2 GET + + A GET-form uses the method GET, as specified in HTML like: + +
+ + +
+ + In your favorite browser, this form will appear with a text box to fill in + and a press-button labeled "OK". If you fill in '1905' and press the OK + button, your browser will then create a new URL to get for you. The URL will + get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the + previous URL. + + If the original form was seen on the page "www.hotmail.com/when/birth.html", + the second page you'll get will become + "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK". + + Most search engines work this way. + + To make curl do the GET form post for you, just enter the expected created + URL: + + curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" + + 4.3 POST + + The GET method makes all input field names get displayed in the URL field of + your browser. That's generally a good thing when you want to be able to + bookmark that page with your given data, but it is an obvious disadvantage + if you entered secret information in one of the fields or if there are a + large amount of fields creating a very long and unreadable URL. + + The HTTP protocol then offers the POST method. This way the client sends the + data separated from the URL and thus you won't see any of it in the URL + address field. + + The form would look very similar to the previous one: + +
+ + +
+ + And to use curl to post this form with the same data filled in as before, we + could do it like: + + curl --data "birthyear=1905&press=%20OK%20" \ + http://www.example.com/when.cgi + + This kind of POST will use the Content-Type + application/x-www-form-urlencoded and is the most widely used POST kind. + + The data you send to the server MUST already be properly encoded, curl will + not do that for you. For example, if you want the data to contain a space, + you need to replace that space with %20 etc. Failing to comply with this + will most likely cause your data to be received wrongly and messed up. + + Recent curl versions can in fact url-encode POST data for you, like this: + + curl --data-urlencode "name=I am Daniel" http://www.example.com + + If you repeat --data several times on the command line, curl will + concatenate all the given data pieces - and put a '&' symbol between each + data segment. + + 4.4 File Upload POST + + Back in late 1995 they defined an additional way to post data over HTTP. It + is documented in the RFC 1867, why this method sometimes is referred to as + RFC1867-posting. + + This method is mainly designed to better support file uploads. A form that + allows a user to upload a file could be written like this in HTML: + +
+ + +
+ + This clearly shows that the Content-Type about to be sent is + multipart/form-data. + + To post to a form like this with curl, you enter a command line like: + + curl --form upload=@localfilename --form press=OK [URL] + + 4.5 Hidden Fields + + A very common way for HTML based applications to pass state information + between pages is to add hidden fields to the forms. Hidden fields are + already filled in, they aren't displayed to the user and they get passed + along just as all the other fields. + + A similar example form with one visible field, one hidden field and one + submit button could look like: + +
+ + + +
+ + To POST this with curl, you won't have to think about if the fields are + hidden or not. To curl they're all the same: + + curl --data "birthyear=1905&press=OK&person=daniel" [URL] + + 4.6 Figure Out What A POST Looks Like + + When you're about fill in a form and send to a server by using curl instead + of a browser, you're of course very interested in sending a POST exactly the + way your browser does. + + An easy way to get to see this, is to save the HTML page with the form on + your local disk, modify the 'method' to a GET, and press the submit button + (you could also change the action URL if you want to). + + You will then clearly see the data get appended to the URL, separated with a + '?'-letter as GET forms are supposed to. + +5. HTTP upload + + 5.1 PUT + + Perhaps the best way to upload data to a HTTP server is to use PUT. Then + again, this of course requires that someone put a program or script on the + server end that knows how to receive a HTTP PUT stream. + + Put a file to a HTTP server with curl: + + curl --upload-file uploadfile http://www.example.com/receive.cgi + +6. HTTP Authentication + + 6.1 Basic Authentication + + HTTP Authentication is the ability to tell the server your username and + password so that it can verify that you're allowed to do the request you're + doing. The Basic authentication used in HTTP (which is the type curl uses by + default) is *plain* *text* based, which means it sends username and password + only slightly obfuscated, but still fully readable by anyone that sniffs on + the network between you and the remote server. + + To tell curl to use a user and password for authentication: + + curl --user name:password http://www.example.com + + 6.2 Other Authentication + + The site might require a different authentication method (check the headers + returned by the server), and then --ntlm, --digest, --negotiate or even + --anyauth might be options that suit you. + + 6.3 Proxy Authentication + + Sometimes your HTTP access is only available through the use of a HTTP + proxy. This seems to be especially common at various companies. A HTTP proxy + may require its own user and password to allow the client to get through to + the Internet. To specify those with curl, run something like: + + curl --proxy-user proxyuser:proxypassword curl.haxx.se + + If your proxy requires the authentication to be done using the NTLM method, + use --proxy-ntlm, if it requires Digest use --proxy-digest. + + If you use any one of these user+password options but leave out the password + part, curl will prompt for the password interactively. + + 6.4 Hiding credentials + + Do note that when a program is run, its parameters might be possible to see + when listing the running processes of the system. Thus, other users may be + able to watch your passwords if you pass them as plain command line + options. There are ways to circumvent this. + + It is worth noting that while this is how HTTP Authentication works, very + many web sites will not use this concept when they provide logins etc. See + the Web Login chapter further below for more details on that. + +7. More HTTP Headers + + 7.1 Referer + + A HTTP request may include a 'referer' field (yes it is misspelled), which + can be used to tell from which URL the client got to this particular + resource. Some programs/scripts check the referer field of requests to verify + that this wasn't arriving from an external site or an unknown page. While + this is a stupid way to check something so easily forged, many scripts still + do it. Using curl, you can put anything you want in the referer-field and + thus more easily be able to fool the server into serving your request. + + Use curl to set the referer field with: + + curl --referer http://www.example.come http://www.example.com + + 7.2 User Agent + + Very similar to the referer field, all HTTP requests may set the User-Agent + field. It names what user agent (client) that is being used. Many + applications use this information to decide how to display pages. Silly web + programmers try to make different pages for users of different browsers to + make them look the best possible for their particular browsers. They usually + also do different kinds of javascript, vbscript etc. + + At times, you will see that getting a page with curl will not return the same + page that you see when getting the page with your browser. Then you know it + is time to set the User Agent field to fool the server into thinking you're + one of those browsers. + + To make curl look like Internet Explorer 5 on a Windows 2000 box: + + curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL] + + Or why not look like you're using Netscape 4.73 on an old Linux box: + + curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] + +8. Redirects + + 8.1 Location header + + When a resource is requested from a server, the reply from the server may + include a hint about where the browser should go next to find this page, or a + new page keeping newly generated output. The header that tells the browser + to redirect is Location:. + + Curl does not follow Location: headers by default, but will simply display + such pages in the same manner it displays all HTTP replies. It does however + feature an option that will make it attempt to follow the Location: pointers. + + To tell curl to follow a Location: + + curl --location http://www.example.com + + If you use curl to POST to a site that immediately redirects you to another + page, you can safely use --location (-L) and --data/--form together. Curl will + only use POST in the first request, and then revert to GET in the following + operations. + + 8.2 Other redirects + + Browser typically support at least two other ways of redirects that curl + doesn't: first the html may contain a meta refresh tag that asks the browser + to load a specific URL after a set number of seconds, or it may use + javascript to do it. + +9. Cookies + + 9.1 Cookie Basics + + The way the web browsers do "client side state control" is by using + cookies. Cookies are just names with associated contents. The cookies are + sent to the client by the server. The server tells the client for what path + and host name it wants the cookie sent back, and it also sends an expiration + date and a few more properties. + + When a client communicates with a server with a name and path as previously + specified in a received cookie, the client sends back the cookies and their + contents to the server, unless of course they are expired. + + Many applications and servers use this method to connect a series of requests + into a single logical session. To be able to use curl in such occasions, we + must be able to record and send back cookies the way the web application + expects them. The same way browsers deal with them. + + 9.2 Cookie options + + The simplest way to send a few cookies to the server when getting a page with + curl is to add them on the command line like: + + curl --cookie "name=Daniel" http://www.example.com + + Cookies are sent as common HTTP headers. This is practical as it allows curl + to record cookies simply by recording headers. Record cookies with curl by + using the --dump-header (-D) option like: + + curl --dump-header headers_and_cookies http://www.example.com + + (Take note that the --cookie-jar option described below is a better way to + store cookies.) + + Curl has a full blown cookie parsing engine built-in that comes in use if you + want to reconnect to a server and use cookies that were stored from a + previous connection (or hand-crafted manually to fool the server into + believing you had a previous connection). To use previously stored cookies, + you run curl like: + + curl --cookie stored_cookies_in_file http://www.example.com + + Curl's "cookie engine" gets enabled when you use the --cookie option. If you + only want curl to understand received cookies, use --cookie with a file that + doesn't exist. Example, if you want to let curl understand cookies from a + page and follow a location (and thus possibly send back cookies it received), + you can invoke it like: + + curl --cookie nada --location http://www.example.com + + Curl has the ability to read and write cookie files that use the same file + format that Netscape and Mozilla once used. It is a convenient way to share + cookies between scripts or invokes. The --cookie (-b) switch automatically + detects if a given file is such a cookie file and parses it, and by using the + --cookie-jar (-c) option you'll make curl write a new cookie file at the end + of an operation: + + curl --cookie cookies.txt --cookie-jar newcookies.txt \ + http://www.example.com + +10. HTTPS + + 10.1 HTTPS is HTTP secure + + There are a few ways to do secure HTTP transfers. By far the most common + protocol for doing this is what is generally known as HTTPS, HTTP over + SSL. SSL encrypts all the data that is sent and received over the network and + thus makes it harder for attackers to spy on sensitive information. + + SSL (or TLS as the latest version of the standard is called) offers a + truckload of advanced features to allow all those encryptions and key + infrastructure mechanisms encrypted HTTP requires. + + Curl supports encrypted fetches when built to use a TLS library and it can be + built to use one out of a fairly large set of libraries - "curl -V" will show + which one your curl was built to use (if any!). To get a page from a HTTPS + server, simply run curl like: + + curl https://secure.example.com + + 10.2 Certificates + + In the HTTPS world, you use certificates to validate that you are the one + you claim to be, as an addition to normal passwords. Curl supports client- + side certificates. All certificates are locked with a pass phrase, which you + need to enter before the certificate can be used by curl. The pass phrase + can be specified on the command line or if not, entered interactively when + curl queries for it. Use a certificate with curl on a HTTPS server like: + + curl --cert mycert.pem https://secure.example.com + + curl also tries to verify that the server is who it claims to be, by + verifying the server's certificate against a locally stored CA cert + bundle. Failing the verification will cause curl to deny the connection. You + must then use --insecure (-k) in case you want to tell curl to ignore that + the server can't be verified. + + More about server certificate verification and ca cert bundles can be read + in the SSLCERTS document, available online here: + + https://curl.haxx.se/docs/sslcerts.html + + At times you may end up with your own CA cert store and then you can tell + curl to use that to verify the server's certificate: + + curl --cacert ca-bundle.pem https://example.com/ + + +11. Custom Request Elements + +11.1 Modify method and headers + + Doing fancy stuff, you may need to add or change elements of a single curl + request. + + For example, you can change the POST request to a PROPFIND and send the data + as "Content-Type: text/xml" (instead of the default Content-Type) like this: + + curl --data "" --header "Content-Type: text/xml" \ + --request PROPFIND url.com + + You can delete a default header by providing one without content. Like you + can ruin the request by chopping off the Host: header: + + curl --header "Host:" http://www.example.com + + You can add headers the same way. Your server may want a "Destination:" + header, and you can add it: + + curl --header "Destination: http://nowhere" http://example.com + + 11.2 More on changed methods + + It should be noted that curl selects which methods to use on its own + depending on what action to ask for. -d will do POST, -I will do HEAD and so + on. If you use the --request / -X option you can change the method keyword + curl selects, but you will not modify curl's behavior. This means that if you + for example use -d "data" to do a POST, you can modify the method to a + PROPFIND with -X and curl will still think it sends a POST. You can change + the normal GET to a POST method by simply adding -X POST in a command line + like: + + curl -X POST http://example.org/ + + ... but curl will still think and act as if it sent a GET so it won't send any + request body etc. + + +12. Web Login + + 12.1 Some login tricks + + While not strictly just HTTP related, it still causes a lot of people problems + so here's the executive run-down of how the vast majority of all login forms + work and how to login to them using curl. + + It can also be noted that to do this properly in an automated fashion, you + will most certainly need to script things and do multiple curl invokes etc. + + First, servers mostly use cookies to track the logged-in status of the + client, so you will need to capture the cookies you receive in the + responses. Then, many sites also set a special cookie on the login page (to + make sure you got there through their login page) so you should make a habit + of first getting the login-form page to capture the cookies set there. + + Some web-based login systems feature various amounts of javascript, and + sometimes they use such code to set or modify cookie contents. Possibly they + do that to prevent programmed logins, like this manual describes how to... + Anyway, if reading the code isn't enough to let you repeat the behavior + manually, capturing the HTTP requests done by your browsers and analyzing the + sent cookies is usually a working method to work out how to shortcut the + javascript need. + + In the actual
tag for the login, lots of sites fill-in random/session + or otherwise secretly generated hidden tags and you may need to first capture + the HTML code for the login form and extract all the hidden fields to be able + to do a proper login POST. Remember that the contents need to be URL encoded + when sent in a normal POST. + +13. Debug + + 13.1 Some debug tricks + + Many times when you run curl on a site, you'll notice that the site doesn't + seem to respond the same way to your curl requests as it does to your + browser's. + + Then you need to start making your curl requests more similar to your + browser's requests: + + * Use the --trace-ascii option to store fully detailed logs of the requests + for easier analyzing and better understanding + + * Make sure you check for and use cookies when needed (both reading with + --cookie and writing with --cookie-jar) + + * Set user-agent to one like a recent popular browser does + + * Set referer like it is set by the browser + + * If you use POST, make sure you send all the fields and in the same order as + the browser does it. + + A very good helper to make sure you do this right, is the LiveHTTPHeader tool + that lets you view all headers you send and receive with Mozilla/Firefox + (even when using HTTPS). Chrome features similar functionality out of the box + among the developer's tools. + + A more raw approach is to capture the HTTP traffic on the network with tools + such as ethereal or tcpdump and check what headers that were sent and + received by the browser. (HTTPS makes this technique inefficient.) + +14. References + + 14.1 Standards + + RFC 7230 is a must to read if you want in-depth understanding of the HTTP + protocol + + RFC 3986 explains the URL syntax + + RFC 1867 defines the HTTP post upload format + + RFC 6525 defines how HTTP cookies work + + 14.2 Sites + + https://curl.haxx.se is the home of the curl project diff --git a/docs/VERSIONS b/docs/VERSIONS new file mode 100644 index 0000000000..72a45474de --- /dev/null +++ b/docs/VERSIONS @@ -0,0 +1,56 @@ +Version Numbers and Releases +============================ + + Curl is not only curl. Curl is also libcurl. They're actually individually + versioned, but they mostly follow each other rather closely. + + The version numbering is always built up using the same system: + + X.Y.Z + + - X is main version number + - Y is release number + - Z is patch number + +## Bumping numbers + + One of these numbers will get bumped in each new release. The numbers to the + right of a bumped number will be reset to zero. If Z is zero, it may not be + included in the version number. + + The main version number will get bumped when *really* big, world colliding + changes are made. The release number is bumped when changes are performed or + things/features are added. The patch number is bumped when the changes are + mere bugfixes. + + It means that after release 1.2.3, we can release 2.0 if something really big + has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs + were fixed. + + Bumping, as in increasing the number with 1, is unconditionally only + affecting one of the numbers (except the ones to the right of it, that may be + set to zero). 1 becomes 2, 3 becomes 4, 9 becomes 10, 88 becomes 89 and 99 + becomes 100. So, after 1.2.9 comes 1.2.10. After 3.99.3, 3.100 might come. + + All original curl source release archives are named according to the libcurl + version (not according to the curl client version that, as said before, might + differ). + + As a service to any application that might want to support new libcurl + features while still being able to build with older versions, all releases + have the libcurl version stored in the curl/curlver.h file using a static + numbering scheme that can be used for comparison. The version number is + defined as: + + #define LIBCURL_VERSION_NUM 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal. All three number fields are always represented using two digits + (eight bits each). 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit hexadecimal number is always a greater number in a more recent + release. It makes comparisons with greater than and less than work. + + This number is also available as three separate defines: + `LIBCURL_VERSION_MAJOR`, `LIBCURL_VERSION_MINOR` and `LIBCURL_VERSION_PATCH`. diff --git a/docs/cmdline-opts/CMakeLists.txt b/docs/cmdline-opts/CMakeLists.txt new file mode 100644 index 0000000000..3c020d418d --- /dev/null +++ b/docs/cmdline-opts/CMakeLists.txt @@ -0,0 +1,12 @@ +set(MANPAGE "${CURL_BINARY_DIR}/docs/curl.1") + +# Load DPAGES and OTHERPAGES from shared file +transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") +include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") + +add_custom_command(OUTPUT "${MANPAGE}" + COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/gen.pl" mainpage "${CMAKE_CURRENT_SOURCE_DIR}" > "${MANPAGE}" + DEPENDS ${DPAGES} ${OTHERPAGES} + VERBATIM +) +add_custom_target(generate-curl.1 DEPENDS "${MANPAGE}") diff --git a/docs/cmdline-opts/MANPAGE.md b/docs/cmdline-opts/MANPAGE.md new file mode 100644 index 0000000000..3a8270b03e --- /dev/null +++ b/docs/cmdline-opts/MANPAGE.md @@ -0,0 +1,52 @@ +# curl man page generator + +This is the curl man page generator. It generates a single nroff man page +output from the set of sources files in this directory. + +There is one source file for each supported command line option. The format is +described below. + +## Option files + +Each command line option is described in a file named `.d`, where +option name is written without any prefixing dashes. Like the file name for +the -v, --verbose option is named `verbose.d`. + +Each file has a set of meta-data and a body of text. + +### Meta-data + + Short: (single letter, without dash) + Long: (long form name, without dashes) + Arg: (the argument the option takes) + Magic: (description of "magic" options) + Tags: (space separated list) + Protocols: (space separated list for which protocols this option works) + Added: (version number in which this was added) + Mutexed: (space separated list of options this overrides, no dashes) + Requires: (space separated list of features this requires, no dashes) + See-also: (space separated list of related options, no dashes) + Help: (short text for the --help output for this option) + --- (end of meta-data) + +### Body + +The body of the description. Only refer to options with their long form option +version, like --verbose. The output generator will replace such with the +correct markup that shows both short and long version. + +## Header + +`page-header` is the nroff formatted file that will be output before the +generated options output for the master man page. + +## Generate + +`./gen.pl mainpage` + +This command outputs a single huge nroff file, meant to become `curl.1`. The +full curl man page. + +`./gen.pl listhelp` + +Generates a full `curl --help` output for all known command line options. diff --git a/docs/cmdline-opts/Makefile.am b/docs/cmdline-opts/Makefile.am new file mode 100644 index 0000000000..e6ecf7a6b0 --- /dev/null +++ b/docs/cmdline-opts/Makefile.am @@ -0,0 +1,34 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://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 + +MANPAGE = $(top_builddir)/docs/curl.1 + +include Makefile.inc + +EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl $(OTHERPAGES) CMakeLists.txt + +all: $(MANPAGE) + +$(MANPAGE): $(DPAGES) $(OTHERPAGES) Makefile.inc + @PERL@ $(srcdir)/gen.pl mainpage $(srcdir) > $(MANPAGE) diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc new file mode 100644 index 0000000000..829551ff62 --- /dev/null +++ b/docs/cmdline-opts/Makefile.inc @@ -0,0 +1,215 @@ +# Shared between Makefile.am and CMakeLists.txt + +DPAGES = \ + abstract-unix-socket.d \ + alt-svc.d \ + anyauth.d \ + append.d basic.d \ + cacert.d capath.d \ + cert-status.d \ + cert-type.d \ + cert.d \ + ciphers.d \ + compressed-ssh.d \ + compressed.d \ + config.d \ + connect-timeout.d \ + connect-to.d \ + continue-at.d \ + cookie-jar.d \ + cookie.d \ + create-dirs.d \ + crlf.d crlfile.d \ + data-ascii.d \ + data-binary.d \ + data-urlencode.d \ + data.d data-raw.d \ + delegation.d \ + digest.d \ + disable-eprt.d \ + disable-epsv.d \ + disable.d \ + disallow-username-in-url.d \ + dns-interface.d \ + dns-ipv4-addr.d \ + dns-ipv6-addr.d \ + dns-servers.d \ + doh-url.d \ + dump-header.d \ + egd-file.d \ + engine.d \ + etag-save.d \ + etag-compare.d \ + expect100-timeout.d \ + fail-early.d \ + fail.d \ + false-start.d \ + form-string.d \ + form.d \ + ftp-account.d \ + ftp-alternative-to-user.d \ + ftp-create-dirs.d \ + ftp-method.d \ + ftp-pasv.d \ + ftp-port.d \ + ftp-pret.d \ + ftp-skip-pasv-ip.d \ + ftp-ssl-ccc-mode.d \ + ftp-ssl-ccc.d \ + ftp-ssl-control.d \ + get.d globoff.d \ + happy-eyeballs-timeout-ms.d \ + haproxy-protocol.d \ + head.d header.d \ + help.d \ + hostpubmd5.d \ + http0.9.d \ + http1.0.d \ + http1.1.d http2.d \ + http2-prior-knowledge.d \ + http3.d \ + ignore-content-length.d \ + include.d \ + insecure.d \ + interface.d \ + ipv4.d ipv6.d \ + junk-session-cookies.d \ + keepalive-time.d \ + key.d key-type.d \ + krb.d libcurl.d \ + limit-rate.d \ + list-only.d \ + local-port.d \ + location-trusted.d \ + location.d \ + login-options.d \ + mail-auth.d \ + mail-from.d \ + mail-rcpt.d \ + manual.d \ + max-filesize.d \ + max-redirs.d \ + max-time.d \ + metalink.d \ + negotiate.d \ + netrc-file.d \ + netrc-optional.d \ + netrc.d \ + next.d no-alpn.d \ + no-buffer.d \ + no-keepalive.d \ + no-npn.d \ + no-progress-meter.d \ + no-sessionid.d \ + noproxy.d \ + ntlm.d ntlm-wb.d \ + oauth2-bearer.d \ + output.d \ + parallel-immediate.d \ + parallel-max.d \ + parallel.d \ + pass.d \ + path-as-is.d \ + pinnedpubkey.d \ + post301.d \ + post302.d \ + post303.d \ + preproxy.d \ + progress-bar.d \ + proto-default.d \ + proto-redir.d \ + proto.d \ + proxy-anyauth.d \ + proxy-basic.d \ + proxy-cacert.d \ + proxy-capath.d \ + proxy-cert-type.d \ + proxy-cert.d \ + proxy-ciphers.d \ + proxy-crlfile.d \ + proxy-digest.d \ + proxy-header.d \ + proxy-insecure.d \ + proxy-key-type.d \ + proxy-key.d \ + proxy-negotiate.d \ + proxy-ntlm.d \ + proxy-pass.d \ + proxy-pinnedpubkey.d \ + proxy-service-name.d \ + proxy-ssl-allow-beast.d \ + proxy-tls13-ciphers.d \ + proxy-tlsauthtype.d \ + proxy-tlspassword.d \ + proxy-tlsuser.d \ + proxy-tlsv1.d \ + proxy-user.d \ + proxy.d \ + proxy1.0.d \ + proxytunnel.d \ + pubkey.d quote.d \ + random-file.d \ + range.d raw.d \ + referer.d \ + remote-header-name.d \ + remote-name-all.d \ + remote-name.d \ + remote-time.d \ + request-target.d \ + request.d \ + resolve.d \ + retry-connrefused.d \ + retry-delay.d \ + retry-max-time.d \ + retry.d \ + sasl-authzid.d \ + sasl-ir.d \ + service-name.d \ + show-error.d \ + silent.d \ + socks4.d socks5.d \ + socks4a.d \ + socks5-basic.d \ + socks5-gssapi-nec.d \ + socks5-gssapi-service.d \ + socks5-gssapi.d \ + socks5-hostname.d \ + speed-limit.d \ + speed-time.d \ + ssl-allow-beast.d \ + ssl-no-revoke.d \ + ssl-reqd.d \ + ssl.d \ + sslv2.d sslv3.d \ + stderr.d \ + styled-output.d \ + suppress-connect-headers.d \ + tcp-fastopen.d \ + tcp-nodelay.d \ + telnet-option.d \ + tftp-blksize.d \ + tftp-no-options.d \ + time-cond.d \ + tls-max.d \ + tls13-ciphers.d \ + tlsauthtype.d \ + tlspassword.d \ + tlsuser.d \ + tlsv1.0.d \ + tlsv1.1.d \ + tlsv1.2.d \ + tlsv1.3.d tlsv1.d \ + tr-encoding.d \ + trace-ascii.d \ + trace-time.d \ + trace.d \ + unix-socket.d \ + upload-file.d \ + url.d use-ascii.d \ + user-agent.d \ + user.d verbose.d \ + version.d \ + write-out.d \ + xattr.d + +OTHERPAGES = page-footer page-header diff --git a/docs/cmdline-opts/abstract-unix-socket.d b/docs/cmdline-opts/abstract-unix-socket.d new file mode 100644 index 0000000000..1fda4e5df3 --- /dev/null +++ b/docs/cmdline-opts/abstract-unix-socket.d @@ -0,0 +1,9 @@ +Long: abstract-unix-socket +Arg: +Help: Connect via abstract Unix domain socket +Added: 7.53.0 +Protocols: HTTP +--- +Connect through an abstract Unix domain socket, instead of using the network. +Note: netstat shows the path of an abstract socket prefixed with '@', however +the argument should not have this leading character. diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d new file mode 100644 index 0000000000..15877a2fee --- /dev/null +++ b/docs/cmdline-opts/alt-svc.d @@ -0,0 +1,17 @@ +Long: alt-svc +Arg: +Protocols: HTTPS +Help: Enable alt-svc with this cache file +Added: 7.64.1 +--- +WARNING: this option is experimental. Do not use in production. + +This option enables the alt-svc parser in curl. If the file name points to an +existing alt-svc cache file, that will be used. After a completed transfer, +the cache will be saved to the file name again if it has been modified. + +Specify a "" file name (zero length) to avoid loading/saving and make curl +just handle the cache in memory. + +If this option is used several times, curl will load contents from all the +files but the last one will be used for saving. diff --git a/docs/cmdline-opts/anyauth.d b/docs/cmdline-opts/anyauth.d new file mode 100644 index 0000000000..c32d1ed5ef --- /dev/null +++ b/docs/cmdline-opts/anyauth.d @@ -0,0 +1,17 @@ +Long: anyauth +Help: Pick any authentication method +Protocols: HTTP +See-also: proxy-anyauth basic digest +--- +Tells curl to figure out authentication method by itself, and use the most +secure one the remote site claims to support. This is done by first doing a +request and checking the response-headers, thus possibly inducing an extra +network round-trip. This is used instead of setting a specific authentication +method, which you can do with --basic, --digest, --ntlm, and --negotiate. + +Using --anyauth is not recommended if you do uploads from stdin, since it may +require data to be sent twice and then the client must be able to rewind. If +the need should arise when uploading from stdin, the upload operation will +fail. + +Used together with --user. diff --git a/docs/cmdline-opts/append.d b/docs/cmdline-opts/append.d new file mode 100644 index 0000000000..f001b1239d --- /dev/null +++ b/docs/cmdline-opts/append.d @@ -0,0 +1,8 @@ +Short: a +Long: append +Help: Append to target file when uploading +Protocols: FTP SFTP +--- +When used in an upload, this makes curl append to the target file instead of +overwriting it. If the remote file doesn't exist, it will be created. Note +that this flag is ignored by some SFTP servers (including OpenSSH). diff --git a/docs/cmdline-opts/basic.d b/docs/cmdline-opts/basic.d new file mode 100644 index 0000000000..09d42af9d4 --- /dev/null +++ b/docs/cmdline-opts/basic.d @@ -0,0 +1,11 @@ +Long: basic +Help: Use HTTP Basic Authentication +See-also: proxy-basic +Protocols: HTTP +--- +Tells curl to use HTTP Basic authentication with the remote host. This is the +default and this option is usually pointless, unless you use it to override a +previously set option that sets a different authentication method (such as +--ntlm, --digest, or --negotiate). + +Used together with --user. diff --git a/docs/cmdline-opts/cacert.d b/docs/cmdline-opts/cacert.d new file mode 100644 index 0000000000..6a56787522 --- /dev/null +++ b/docs/cmdline-opts/cacert.d @@ -0,0 +1,33 @@ +Long: cacert +Arg: +Help: CA certificate to verify peer against +Protocols: TLS +--- +Tells curl to use the specified certificate file to verify the peer. The file +may contain multiple CA certificates. The certificate(s) must be in PEM +format. Normally curl is built to use a default file for this, so this option +is typically used to alter that default file. + +curl recognizes the environment variable named 'CURL_CA_BUNDLE' if it is +set, and uses the given path as a path to a CA cert bundle. This option +overrides that variable. + +The windows version of curl will automatically look for a CA certs file named +\'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the +Current Working Directory, or in any folder along your PATH. + +If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module +(libnsspem.so) needs to be available for this option to work properly. + +(iOS and macOS only) If curl is built against Secure Transport, then this +option is supported for backward compatibility with other SSL engines, but it +should not be set. If the option is not set, then curl will use the +certificates in the system and user Keychain to verify the peer, which is the +preferred method of verifying the peer's certificate chain. + +(Schannel only) This option is supported for Schannel in Windows 7 or later with +libcurl 7.60 or later. This option is supported for backward compatibility +with other SSL engines; instead it is recommended to use Windows' store of +root certificates (the default for Schannel). + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/capath.d b/docs/cmdline-opts/capath.d new file mode 100644 index 0000000000..0763f7a0d4 --- /dev/null +++ b/docs/cmdline-opts/capath.d @@ -0,0 +1,15 @@ +Long: capath +Arg: +Help: CA directory to verify peer against +Protocols: TLS +--- +Tells curl to use the specified certificate directory to verify the +peer. Multiple paths can be provided by separating them with ":" (e.g. +\&"path1:path2:path3"). The certificates must be in PEM format, and if curl is +built against OpenSSL, the directory must have been processed using the +c_rehash utility supplied with OpenSSL. Using --capath can allow +OpenSSL-powered curl to make SSL-connections much more efficiently than using +--cacert if the --cacert file contains many CA certificates. + +If this option is set, the default capath value will be ignored, and if it is +used several times, the last one will be used. diff --git a/docs/cmdline-opts/cert-status.d b/docs/cmdline-opts/cert-status.d new file mode 100644 index 0000000000..f1aaa21744 --- /dev/null +++ b/docs/cmdline-opts/cert-status.d @@ -0,0 +1,13 @@ +Long: cert-status +Protocols: TLS +Added: 7.41.0 +Help: Verify the status of the server certificate +--- +Tells curl to verify the status of the server certificate by using the +Certificate Status Request (aka. OCSP stapling) TLS extension. + +If this option is enabled and the server sends an invalid (e.g. expired) +response, if the response suggests that the server certificate has been revoked, +or no response at all is received, the verification fails. + +This is currently only implemented in the OpenSSL, GnuTLS and NSS backends. diff --git a/docs/cmdline-opts/cert-type.d b/docs/cmdline-opts/cert-type.d new file mode 100644 index 0000000000..55d8033b45 --- /dev/null +++ b/docs/cmdline-opts/cert-type.d @@ -0,0 +1,10 @@ +Long: cert-type +Protocols: TLS +Arg: +Help: Certificate file type +See-also: cert key key-type +--- +Tells curl what type the provided client certificate is using. PEM, DER, ENG +and P12 are recognized types. If not specified, PEM is assumed. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/cert.d b/docs/cmdline-opts/cert.d new file mode 100644 index 0000000000..de6b42060f --- /dev/null +++ b/docs/cmdline-opts/cert.d @@ -0,0 +1,50 @@ +Short: E +Long: cert +Arg: +Help: Client certificate file and password +Protocols: TLS +See-also: cert-type key key-type +--- +Tells curl to use the specified client certificate file when getting a file +with HTTPS, FTPS or another SSL-based protocol. The certificate must be in +PKCS#12 format if using Secure Transport, or PEM format if using any other +engine. If the optional password isn't specified, it will be queried for on +the terminal. Note that this option assumes a \&"certificate" file that is the +private key and the client certificate concatenated! See --cert and --key to +specify them independently. + +If curl is built against the NSS SSL library then this option can tell +curl the nickname of the certificate to use within the NSS database defined +by the environment variable SSL_DIR (or by default /etc/pki/nssdb). If the +NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files may be +loaded. If you want to use a file from the current directory, please precede +it with "./" prefix, in order to avoid confusion with a nickname. If the +nickname contains ":", it needs to be preceded by "\\" so that it is not +recognized as password delimiter. If the nickname contains "\\", it needs to +be escaped as "\\\\" so that it is not recognized as an escape character. + +If curl is built against OpenSSL library, and the engine pkcs11 is available, +then a PKCS#11 URI (RFC 7512) can be used to specify a certificate located in +a PKCS#11 device. A string beginning with "pkcs11:" will be interpreted as a +PKCS#11 URI. If a PKCS#11 URI is provided, then the --engine option will be set +as "pkcs11" if none was provided and the --cert-type option will be set as +"ENG" if none was provided. + +(iOS and macOS only) If curl is built against Secure Transport, then the +certificate string can either be the name of a certificate/private key in the +system or user keychain, or the path to a PKCS#12-encoded certificate and +private key. If you want to use a file from the current directory, please +precede it with "./" prefix, in order to avoid confusion with a nickname. + +(Schannel only) Client certificates must be specified by a path +expression to a certificate store. (Loading PFX is not supported; you can +import it to a store first). You can use +"\\\\" to refer to a certificate +in the system certificates store, for example, +"CurrentUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a". Thumbprint is +usually a SHA-1 hex string which you can see in certificate details. Following +store locations are supported: CurrentUser, LocalMachine, CurrentService, +Services, CurrentUserGroupPolicy, LocalMachineGroupPolicy, +LocalMachineEnterprise. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/ciphers.d b/docs/cmdline-opts/ciphers.d new file mode 100644 index 0000000000..69e85525a5 --- /dev/null +++ b/docs/cmdline-opts/ciphers.d @@ -0,0 +1,11 @@ +Long: ciphers +Arg: +Help: SSL ciphers to use +Protocols: TLS +--- +Specifies which ciphers to use in the connection. The list of ciphers must +specify valid ciphers. Read up on SSL cipher list details on this URL: + + https://curl.haxx.se/docs/ssl-ciphers.html + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/compressed-ssh.d b/docs/cmdline-opts/compressed-ssh.d new file mode 100644 index 0000000000..583452ae47 --- /dev/null +++ b/docs/cmdline-opts/compressed-ssh.d @@ -0,0 +1,7 @@ +Long: compressed-ssh +Help: Enable SSH compression +Protocols: SCP SFTP +Added: 7.56.0 +--- +Enables built-in SSH compression. +This is a request, not an order; the server may or may not do it. diff --git a/docs/cmdline-opts/compressed.d b/docs/cmdline-opts/compressed.d new file mode 100644 index 0000000000..dc130c1f02 --- /dev/null +++ b/docs/cmdline-opts/compressed.d @@ -0,0 +1,7 @@ +Long: compressed +Help: Request compressed response +Protocols: HTTP +--- +Request a compressed response using one of the algorithms curl supports, and +save the uncompressed document. If this option is used and the server sends +an unsupported encoding, curl will report an error. diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d new file mode 100644 index 0000000000..df3d39220a --- /dev/null +++ b/docs/cmdline-opts/config.d @@ -0,0 +1,61 @@ +Long: config +Arg: +Help: Read config from a file +Short: K +--- + +Specify a text file to read curl arguments from. The command line arguments +found in the text file will be used as if they were provided on the command +line. + +Options and their parameters must be specified on the same line in the file, +separated by whitespace, colon, or the equals sign. Long option names can +optionally be given in the config file without the initial double dashes and +if so, the colon or equals characters can be used as separators. If the option +is specified with one or two dashes, there can be no colon or equals character +between the option and its parameter. + +If the parameter contains whitespace (or starts with : or =), the parameter +must be enclosed within quotes. Within double quotes, the following escape +sequences are available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash +preceding any other letter is ignored. If the first column of a config line is +a '#' character, the rest of the line will be treated as a comment. Only write +one option per physical line in the config file. + +Specify the filename to --config as '-' to make curl read the file from stdin. + +Note that to be able to specify a URL in the config file, you need to specify +it using the --url option, and not by simply writing the URL on its own +line. So, it could look similar to this: + +url = "https://curl.haxx.se/docs/" + +When curl is invoked, it (unless --disable is used) checks for a default +config file and uses it if found. The default config file is checked for in +the following places in this order: + +1) curl tries to find the "home dir": It first checks for the CURL_HOME and +then the HOME environment variables. Failing that, it uses getpwuid() on +Unix-like systems (which returns the home dir given the current user in your +system). On Windows, it then checks for the APPDATA variable, or as a last +resort the '%USERPROFILE%\\Application Data'. + +2) On windows, if there is no .curlrc file in the home dir, it checks for one +in the same dir the curl executable is placed. On Unix-like systems, it will +simply try to load .curlrc from the determined home dir. + +.nf +# --- Example file --- +# this is a comment +url = "example.com" +output = "curlhere.html" +user-agent = "superagent/1.0" + +# and fetch another URL too +url = "example.com/docs/manpage.html" +-O +referer = "http://nowhereatall.example.com/" +# --- End of example file --- +.fi + +This option can be used multiple times to load multiple config files. diff --git a/docs/cmdline-opts/connect-timeout.d b/docs/cmdline-opts/connect-timeout.d new file mode 100644 index 0000000000..3a32d86853 --- /dev/null +++ b/docs/cmdline-opts/connect-timeout.d @@ -0,0 +1,11 @@ +Long: connect-timeout +Arg: +Help: Maximum time allowed for connection +See-also: max-time +--- +Maximum time in seconds that you allow curl's connection to take. This only +limits the connection phase, so if curl connects within the given period it +will continue - if not it will exit. Since version 7.32.0, this option +accepts decimal values. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/connect-to.d b/docs/cmdline-opts/connect-to.d new file mode 100644 index 0000000000..458bfe855f --- /dev/null +++ b/docs/cmdline-opts/connect-to.d @@ -0,0 +1,21 @@ +Long: connect-to +Arg: +Help: Connect to host +Added: 7.49.0 +See-also: resolve header +--- + +For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead. +This option is suitable to direct requests at a specific server, e.g. at a +specific cluster node in a cluster of servers. This option is only used to +establish the network connection. It does NOT affect the hostname/port that is +used for TLS/SSL (e.g. SNI, certificate verification) or for the application +protocols. "HOST1" and "PORT1" may be the empty string, meaning "any +host/port". "HOST2" and "PORT2" may also be the empty string, meaning "use the +request's original host/port". + +A "host" specified to this option is compared as a string, so it needs to +match the name used in request URL. It can be either numerical such as +"127.0.0.1" or the full host name such as "example.org". + +This option can be used many times to add many connect rules. diff --git a/docs/cmdline-opts/continue-at.d b/docs/cmdline-opts/continue-at.d new file mode 100644 index 0000000000..733f4941ea --- /dev/null +++ b/docs/cmdline-opts/continue-at.d @@ -0,0 +1,15 @@ +Short: C +Long: continue-at +Arg: +Help: Resumed transfer offset +See-also: range +--- +Continue/Resume a previous file transfer at the given offset. The given offset +is the exact number of bytes that will be skipped, counting from the beginning +of the source file before it is transferred to the destination. If used with +uploads, the FTP server command SIZE will not be used by curl. + +Use "-C -" to tell curl to automatically find out where/how to resume the +transfer. It then uses the given output/input files to figure that out. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/cookie-jar.d b/docs/cmdline-opts/cookie-jar.d new file mode 100644 index 0000000000..da79777eb6 --- /dev/null +++ b/docs/cmdline-opts/cookie-jar.d @@ -0,0 +1,24 @@ +Short: c +Long: cookie-jar +Arg: +Protocols: HTTP +Help: Write cookies to after operation +--- +Specify to which file you want curl to write all cookies after a completed +operation. Curl writes all cookies from its in-memory cookie storage to the +given file at the end of operations. If no cookies are known, no data will be +written. The file will be written using the Netscape cookie file format. If +you set the file name to a single dash, "-", the cookies will be written to +stdout. + +This command line option will activate the cookie engine that makes curl +record and use cookies. Another way to activate it is to use the --cookie +option. + +If the cookie jar can't be created or written to, the whole curl operation +won't fail or even report an error clearly. Using --verbose will get a warning +displayed, but that is the only visible feedback you get about this possibly +lethal situation. + +If this option is used several times, the last specified file name will be +used. diff --git a/docs/cmdline-opts/cookie.d b/docs/cmdline-opts/cookie.d new file mode 100644 index 0000000000..1e9906977e --- /dev/null +++ b/docs/cmdline-opts/cookie.d @@ -0,0 +1,37 @@ +Short: b +Long: cookie +Arg: +Protocols: HTTP +Help: Send cookies from string/file +--- +Pass the data to the HTTP server in the Cookie header. It is supposedly +the data previously received from the server in a "Set-Cookie:" line. The +data should be in the format "NAME1=VALUE1; NAME2=VALUE2". + +If no '=' symbol is used in the argument, it is instead treated as a filename +to read previously stored cookie from. This option also activates the cookie +engine which will make curl record incoming cookies, which may be handy if +you're using this in combination with the --location option or do multiple URL +transfers on the same invoke. If the file name is exactly a minus ("-"), curl +will instead the contents from stdin. + +The file format of the file to read cookies from should be plain HTTP headers +(Set-Cookie style) or the Netscape/Mozilla cookie file format. + +The file specified with --cookie is only used as input. No cookies will be +written to the file. To store cookies, use the --cookie-jar option. + +Exercise caution if you are using this option and multiple transfers may +occur. If you use the NAME1=VALUE1; format, or in a file use the Set-Cookie +format and don't specify a domain, then the cookie is sent for any domain +(even after redirects are followed) and cannot be modified by a server-set +cookie. If the cookie engine is enabled and a server sets a cookie of the same +name then both will be sent on a future transfer to that server, likely not +what you intended. To address these issues set a domain in Set-Cookie (doing +that will include sub domains) or use the Netscape format. + +If this option is used several times, the last one will be used. + +Users very often want to both read cookies from a file and write updated +cookies back to a file, so using both --cookie and --cookie-jar in the same +command line is common. diff --git a/docs/cmdline-opts/create-dirs.d b/docs/cmdline-opts/create-dirs.d new file mode 100644 index 0000000000..b09d96ca7f --- /dev/null +++ b/docs/cmdline-opts/create-dirs.d @@ -0,0 +1,11 @@ +Long: create-dirs +Help: Create necessary local directory hierarchy +--- +When used in conjunction with the --output option, curl will create the +necessary local directory hierarchy as needed. This option creates the dirs +mentioned with the --output option, nothing else. If the --output file name +uses no dir or if the dirs it mentions already exist, no dir will be created. + +Created dirs are made with mode 0750 on unix style file systems. + +To create remote directories when using FTP or SFTP, try --ftp-create-dirs. diff --git a/docs/cmdline-opts/crlf.d b/docs/cmdline-opts/crlf.d new file mode 100644 index 0000000000..f6694b654d --- /dev/null +++ b/docs/cmdline-opts/crlf.d @@ -0,0 +1,7 @@ +Long: crlf +Help: Convert LF to CRLF in upload +Protocols: FTP SMTP +--- +Convert LF to CRLF in upload. Useful for MVS (OS/390). + +(SMTP added in 7.40.0) diff --git a/docs/cmdline-opts/crlfile.d b/docs/cmdline-opts/crlfile.d new file mode 100644 index 0000000000..0fcc63c85d --- /dev/null +++ b/docs/cmdline-opts/crlfile.d @@ -0,0 +1,10 @@ +Long: crlfile +Arg: +Protocols: TLS +Help: Get a CRL list in PEM format from the given file +Added: 7.19.7 +--- +Provide a file using PEM format with a Certificate Revocation List that may +specify peer certificates that are to be considered revoked. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/data-ascii.d b/docs/cmdline-opts/data-ascii.d new file mode 100644 index 0000000000..bda4abc3d1 --- /dev/null +++ b/docs/cmdline-opts/data-ascii.d @@ -0,0 +1,6 @@ +Long: data-ascii +Arg: +Help: HTTP POST ASCII data +Protocols: HTTP +--- +This is just an alias for --data. diff --git a/docs/cmdline-opts/data-binary.d b/docs/cmdline-opts/data-binary.d new file mode 100644 index 0000000000..3f6ff2dbd0 --- /dev/null +++ b/docs/cmdline-opts/data-binary.d @@ -0,0 +1,18 @@ +Long: data-binary +Arg: +Help: HTTP POST binary data +Protocols: HTTP +--- +This posts data exactly as specified with no extra processing whatsoever. + +If you start the data with the letter @, the rest should be a filename. Data +is posted in a similar manner as --data does, except that newlines and +carriage returns are preserved and conversions are never done. + +Like --data the default content-type sent to the server is +application/x-www-form-urlencoded. If you want the data to be treated as +arbitrary binary data by the server then set the content-type to octet-stream: +-H "Content-Type: application/octet-stream". + +If this option is used several times, the ones following the first will append +data as described in --data. diff --git a/docs/cmdline-opts/data-raw.d b/docs/cmdline-opts/data-raw.d new file mode 100644 index 0000000000..7669b4abfa --- /dev/null +++ b/docs/cmdline-opts/data-raw.d @@ -0,0 +1,9 @@ +Long: data-raw +Arg: +Protocols: HTTP +Help: HTTP POST data, '@' allowed +Added: 7.43.0 +See-also: data +--- +This posts data similarly to --data but without the special +interpretation of the @ character. diff --git a/docs/cmdline-opts/data-urlencode.d b/docs/cmdline-opts/data-urlencode.d new file mode 100644 index 0000000000..9873f3356e --- /dev/null +++ b/docs/cmdline-opts/data-urlencode.d @@ -0,0 +1,33 @@ +Long: data-urlencode +Arg: +Help: HTTP POST data url encoded +Protocols: HTTP +See-also: data data-raw +Added: 7.18.0 +--- +This posts data, similar to the other --data options with the exception +that this performs URL-encoding. + +To be CGI-compliant, the part should begin with a \fIname\fP followed +by a separator and a content specification. The part can be passed to +curl using one of the following syntaxes: +.RS +.IP "content" +This will make curl URL-encode the content and pass that on. Just be careful +so that the content doesn't contain any = or @ symbols, as that will then make +the syntax match one of the other cases below! +.IP "=content" +This will make curl URL-encode the content and pass that on. The preceding = +symbol is not included in the data. +.IP "name=content" +This will make curl URL-encode the content part and pass that on. Note that +the name part is expected to be URL-encoded already. +.IP "@filename" +This will make curl load data from the given file (including any newlines), +URL-encode that data and pass it on in the POST. +.IP "name@filename" +This will make curl load data from the given file (including any newlines), +URL-encode that data and pass it on in the POST. The name part gets an equal +sign appended, resulting in \fIname=urlencoded-file-content\fP. Note that the +name is expected to be URL-encoded already. +.RE diff --git a/docs/cmdline-opts/data.d b/docs/cmdline-opts/data.d new file mode 100644 index 0000000000..8b5200d34a --- /dev/null +++ b/docs/cmdline-opts/data.d @@ -0,0 +1,29 @@ +Long: data +Short: d +Arg: +Help: HTTP POST data +Protocols: HTTP +See-also: data-binary data-urlencode data-raw +Mutexed: form head upload-file +--- +Sends the specified data in a POST request to the HTTP server, in the same way +that a browser does when a user has filled in an HTML form and presses the +submit button. This will cause curl to pass the data to the server using the +content-type application/x-www-form-urlencoded. Compare to --form. + +--data-raw is almost the same but does not have a special interpretation of +the @ character. To post data purely binary, you should instead use the +--data-binary option. To URL-encode the value of a form field you may use +--data-urlencode. + +If any of these options is used more than once on the same command line, the +data pieces specified will be merged together with a separating +&-symbol. Thus, using '-d name=daniel -d skill=lousy' would generate a post +chunk that looks like \&'name=daniel&skill=lousy'. + +If you start the data with the letter @, the rest should be a file name to +read the data from, or - if you want curl to read the data from stdin. Posting +data from a file named \&'foobar' would thus be done with --data @foobar. When +--data is told to read from a file like that, carriage returns and newlines +will be stripped out. If you don't want the @ character to have a special +interpretation use --data-raw instead. diff --git a/docs/cmdline-opts/delegation.d b/docs/cmdline-opts/delegation.d new file mode 100644 index 0000000000..138d82333e --- /dev/null +++ b/docs/cmdline-opts/delegation.d @@ -0,0 +1,16 @@ +Long: delegation +Arg: +Help: GSS-API delegation permission +Protocols: GSS/kerberos +--- +Set LEVEL to tell the server what it is allowed to delegate when it +comes to user credentials. +.RS +.IP "none" +Don't allow any delegation. +.IP "policy" +Delegates if and only if the OK-AS-DELEGATE flag is set in the Kerberos +service ticket, which is a matter of realm policy. +.IP "always" +Unconditionally allow the server to delegate. +.RE diff --git a/docs/cmdline-opts/digest.d b/docs/cmdline-opts/digest.d new file mode 100644 index 0000000000..5cdd9258a0 --- /dev/null +++ b/docs/cmdline-opts/digest.d @@ -0,0 +1,11 @@ +Long: digest +Help: Use HTTP Digest Authentication +Protocols: HTTP +Mutexed: basic ntlm negotiate +See-also: user proxy-digest anyauth +--- +Enables HTTP Digest authentication. This is an authentication scheme that +prevents the password from being sent over the wire in clear text. Use this in +combination with the normal --user option to set user name and password. + +If this option is used several times, only the first one is used. diff --git a/docs/cmdline-opts/disable-eprt.d b/docs/cmdline-opts/disable-eprt.d new file mode 100644 index 0000000000..a1e53c0bd1 --- /dev/null +++ b/docs/cmdline-opts/disable-eprt.d @@ -0,0 +1,19 @@ +Long: disable-eprt +Help: Inhibit using EPRT or LPRT +Protocols: FTP +--- +Tell curl to disable the use of the EPRT and LPRT commands when doing active +FTP transfers. Curl will normally always first attempt to use EPRT, then LPRT +before using PORT, but with this option, it will use PORT right away. EPRT and +LPRT are extensions to the original FTP protocol, and may not work on all +servers, but they enable more functionality in a better way than the +traditional PORT command. + +--eprt can be used to explicitly enable EPRT again and --no-eprt is an alias +for --disable-eprt. + +If the server is accessed using IPv6, this option will have no effect as EPRT +is necessary then. + +Disabling EPRT only changes the active behavior. If you want to switch to +passive mode you need to not use --ftp-port or force it with --ftp-pasv. diff --git a/docs/cmdline-opts/disable-epsv.d b/docs/cmdline-opts/disable-epsv.d new file mode 100644 index 0000000000..6d2cb70898 --- /dev/null +++ b/docs/cmdline-opts/disable-epsv.d @@ -0,0 +1,16 @@ +Long: disable-epsv +Help: Inhibit using EPSV +Protocols: FTP +--- +(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP +transfers. Curl will normally always first attempt to use EPSV before PASV, +but with this option, it will not try using EPSV. + +--epsv can be used to explicitly enable EPSV again and --no-epsv is an alias +for --disable-epsv. + +If the server is an IPv6 host, this option will have no effect as EPSV is +necessary then. + +Disabling EPSV only changes the passive behavior. If you want to switch to +active mode you need to use --ftp-port. diff --git a/docs/cmdline-opts/disable.d b/docs/cmdline-opts/disable.d new file mode 100644 index 0000000000..20b27b4c52 --- /dev/null +++ b/docs/cmdline-opts/disable.d @@ -0,0 +1,7 @@ +Long: disable +Short: q +Help: Disable .curlrc +--- +If used as the first parameter on the command line, the \fIcurlrc\fP config +file will not be read and used. See the --config for details on the default +config file search path. diff --git a/docs/cmdline-opts/disallow-username-in-url.d b/docs/cmdline-opts/disallow-username-in-url.d new file mode 100644 index 0000000000..a7f46ea15c --- /dev/null +++ b/docs/cmdline-opts/disallow-username-in-url.d @@ -0,0 +1,7 @@ +Long: disallow-username-in-url +Help: Disallow username in url +Protocols: HTTP +Added: 7.61.0 +See-also: proto +--- +This tells curl to exit if passed a url containing a username. diff --git a/docs/cmdline-opts/dns-interface.d b/docs/cmdline-opts/dns-interface.d new file mode 100644 index 0000000000..45e5af263e --- /dev/null +++ b/docs/cmdline-opts/dns-interface.d @@ -0,0 +1,11 @@ +Long: dns-interface +Arg: +Help: Interface to use for DNS requests +Protocols: DNS +See-also: dns-ipv4-addr dns-ipv6-addr +Added: 7.33.0 +Requires: c-ares +--- +Tell curl to send outgoing DNS requests through . This option is a +counterpart to --interface (which does not affect DNS). The supplied string +must be an interface name (not an address). diff --git a/docs/cmdline-opts/dns-ipv4-addr.d b/docs/cmdline-opts/dns-ipv4-addr.d new file mode 100644 index 0000000000..597b858845 --- /dev/null +++ b/docs/cmdline-opts/dns-ipv4-addr.d @@ -0,0 +1,11 @@ +Long: dns-ipv4-addr +Arg:
+Help: IPv4 address to use for DNS requests +Protocols: DNS +See-also: dns-interface dns-ipv6-addr +Added: 7.33.0 +Requires: c-ares +--- +Tell curl to bind to when making IPv4 DNS requests, so that +the DNS requests originate from this address. The argument should be a +single IPv4 address. diff --git a/docs/cmdline-opts/dns-ipv6-addr.d b/docs/cmdline-opts/dns-ipv6-addr.d new file mode 100644 index 0000000000..581f019537 --- /dev/null +++ b/docs/cmdline-opts/dns-ipv6-addr.d @@ -0,0 +1,11 @@ +Long: dns-ipv6-addr +Arg:
+Help: IPv6 address to use for DNS requests +Protocols: DNS +See-also: dns-interface dns-ipv4-addr +Added: 7.33.0 +Requires: c-ares +--- +Tell curl to bind to when making IPv6 DNS requests, so that +the DNS requests originate from this address. The argument should be a +single IPv6 address. diff --git a/docs/cmdline-opts/dns-servers.d b/docs/cmdline-opts/dns-servers.d new file mode 100644 index 0000000000..a98fd07d89 --- /dev/null +++ b/docs/cmdline-opts/dns-servers.d @@ -0,0 +1,10 @@ +Long: dns-servers +Arg: +Help: DNS server addrs to use +Requires: c-ares +Added: 7.33.0 +--- +Set the list of DNS servers to be used instead of the system default. +The list of IP addresses should be separated with commas. Port numbers +may also optionally be given as \fI:\fP after each IP +address. diff --git a/docs/cmdline-opts/doh-url.d b/docs/cmdline-opts/doh-url.d new file mode 100644 index 0000000000..c871c4d221 --- /dev/null +++ b/docs/cmdline-opts/doh-url.d @@ -0,0 +1,10 @@ +Long: doh-url +Arg: +Help: Resolve host names over DOH +Protocols: all +Added: 7.62.0 +--- +Specifies which DNS-over-HTTPS (DOH) server to use to resolve hostnames, +instead of using the default name resolver mechanism. The URL must be HTTPS. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/dump-header.d b/docs/cmdline-opts/dump-header.d new file mode 100644 index 0000000000..33c6674e80 --- /dev/null +++ b/docs/cmdline-opts/dump-header.d @@ -0,0 +1,20 @@ +Long: dump-header +Short: D +Arg: +Help: Write the received headers to +Protocols: HTTP FTP +See-also: output +--- +Write the received protocol headers to the specified file. + +This option is handy to use when you want to store the headers that an HTTP +site sends to you. Cookies from the headers could then be read in a second +curl invocation by using the --cookie option! The --cookie-jar option is a +better way to store cookies. + +If no headers are received, the use of this option will create an empty file. + +When used in FTP, the FTP server response lines are considered being "headers" +and thus are saved there. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/egd-file.d b/docs/cmdline-opts/egd-file.d new file mode 100644 index 0000000000..c22790f6ae --- /dev/null +++ b/docs/cmdline-opts/egd-file.d @@ -0,0 +1,8 @@ +Long: egd-file +Arg: +Help: EGD socket path for random data +Protocols: TLS +See-also: random-file +--- +Specify the path name to the Entropy Gathering Daemon socket. The socket is +used to seed the random engine for SSL connections. diff --git a/docs/cmdline-opts/engine.d b/docs/cmdline-opts/engine.d new file mode 100644 index 0000000000..cde1a47735 --- /dev/null +++ b/docs/cmdline-opts/engine.d @@ -0,0 +1,8 @@ +Long: engine +Arg: +Help: Crypto engine to use +Protocols: TLS +--- +Select the OpenSSL crypto engine to use for cipher operations. Use --engine +list to print a list of build-time supported engines. Note that not all (or +none) of the engines may be available at run-time. diff --git a/docs/cmdline-opts/etag-compare.d b/docs/cmdline-opts/etag-compare.d new file mode 100644 index 0000000000..1a698a8ffe --- /dev/null +++ b/docs/cmdline-opts/etag-compare.d @@ -0,0 +1,18 @@ +Long: etag-compare +Arg: +Help: Pass an ETag from a file as a custom header +Protocols: HTTP +Added: 7.68.0 +--- +This option makes a conditional HTTP request for the specific +ETag read from the given file by sending a custom If-None-Match +header using the extracted ETag. + +For correct results, make sure that specified file contains only a single +line with a desired ETag. An empty file is parsed as an empty ETag. + +Use the option --etag-save to first save the ETag from a response, and +then use this option to compare using the saved ETag in a subsequent request. + +\fCOMPARISON\fP: There are 2 types of comparison or ETags, Weak and Strong. +This option expects, and uses a strong comparison. diff --git a/docs/cmdline-opts/etag-save.d b/docs/cmdline-opts/etag-save.d new file mode 100644 index 0000000000..214723ff51 --- /dev/null +++ b/docs/cmdline-opts/etag-save.d @@ -0,0 +1,16 @@ +Long: etag-save +Arg: +Help: Parse ETag from a request and save it to a file +Protocols: HTTP +Added: 7.68.0 +--- +This option saves an HTTP ETag to the specified file. Etag is +usually part of headers returned by a request. When server sends an +ETag, it must be enveloped by a double quote. This option extracts the +ETag without the double quotes and saves it into the . + +A server can send a week ETag which is prefixed by "W/". This identifier +is not considered, and only relevant ETag between quotation marks is parsed. + +It an ETag wasn't send by the server or it cannot be parsed, and empty +file is created. diff --git a/docs/cmdline-opts/expect100-timeout.d b/docs/cmdline-opts/expect100-timeout.d new file mode 100644 index 0000000000..c88f0b84fd --- /dev/null +++ b/docs/cmdline-opts/expect100-timeout.d @@ -0,0 +1,11 @@ +Long: expect100-timeout +Arg: +Help: How long to wait for 100-continue +Protocols: HTTP +Added: 7.47.0 +See-also: connect-timeout +--- +Maximum time in seconds that you allow curl to wait for a 100-continue +response when curl emits an Expects: 100-continue header in its request. By +default curl will wait one second. This option accepts decimal values! When +curl stops waiting, it will continue as if the response has been received. diff --git a/docs/cmdline-opts/fail-early.d b/docs/cmdline-opts/fail-early.d new file mode 100644 index 0000000000..375d4c9195 --- /dev/null +++ b/docs/cmdline-opts/fail-early.d @@ -0,0 +1,21 @@ +Long: fail-early +Help: Fail on first transfer error, do not continue +Added: 7.52.0 +--- +Fail and exit on the first detected transfer error. + +When curl is used to do multiple transfers on the command line, it will +attempt to operate on each given URL, one by one. By default, it will ignore +errors if there are more URLs given and the last URL's success will determine +the error code curl returns. So early failures will be "hidden" by subsequent +successful transfers. + +Using this option, curl will instead return an error on the first transfer +that fails, independent of the amount of URLs that are given on the command +line. This way, no transfer failures go undetected by scripts and similar. + +This option is global and does not need to be specified for each use of --next. + +This option does not imply --fail, which causes transfers to fail due to the +server's HTTP status code. You can combine the two options, however note --fail +is not global and is therefore contained by --next. diff --git a/docs/cmdline-opts/fail.d b/docs/cmdline-opts/fail.d new file mode 100644 index 0000000000..c46c571bfe --- /dev/null +++ b/docs/cmdline-opts/fail.d @@ -0,0 +1,14 @@ +Long: fail +Short: f +Protocols: HTTP +Help: Fail silently (no output at all) on HTTP errors +--- +Fail silently (no output at all) on server errors. This is mostly done to +better enable scripts etc to better deal with failed attempts. In normal cases +when an HTTP server fails to deliver a document, it returns an HTML document +stating so (which often also describes why and more). This flag will prevent +curl from outputting that and return error 22. + +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). diff --git a/docs/cmdline-opts/false-start.d b/docs/cmdline-opts/false-start.d new file mode 100644 index 0000000000..65a8afb8f3 --- /dev/null +++ b/docs/cmdline-opts/false-start.d @@ -0,0 +1,12 @@ +Long: false-start +Help: Enable TLS False Start +Protocols: TLS +Added: 7.42.0 +--- +Tells curl to use false start during the TLS handshake. False start is a mode +where a TLS client will start sending application data before verifying the +server's Finished message, thus saving a round trip when performing a full +handshake. + +This is currently only implemented in the NSS and Secure Transport (on iOS 7.0 +or later, or OS X 10.9 or later) backends. diff --git a/docs/cmdline-opts/form-string.d b/docs/cmdline-opts/form-string.d new file mode 100644 index 0000000000..49d0d44ef8 --- /dev/null +++ b/docs/cmdline-opts/form-string.d @@ -0,0 +1,11 @@ +Long: form-string +Help: Specify multipart MIME data +Protocols: HTTP SMTP IMAP +Arg: +See-also: form +--- +Similar to --form except that the value string for the named parameter is used +literally. Leading \&'@' and \&'<' characters, and the \&';type=' string in +the value have no special meaning. Use this in preference to --form if +there's any possibility that the string value may accidentally trigger the +\&'@' or \&'<' features of --form. diff --git a/docs/cmdline-opts/form.d b/docs/cmdline-opts/form.d new file mode 100644 index 0000000000..7f1aa31c3b --- /dev/null +++ b/docs/cmdline-opts/form.d @@ -0,0 +1,138 @@ +Long: form +Short: F +Arg: +Help: Specify multipart MIME data +Protocols: HTTP SMTP IMAP +Mutexed: data head upload-file +--- +For HTTP protocol family, this lets curl emulate a filled-in form in which a +user has pressed the submit button. This causes curl to POST data using the +Content-Type multipart/form-data according to RFC 2388. + +For SMTP and IMAP protocols, this is the mean to compose a multipart mail +message to transmit. + +This enables uploading of binary files etc. To force the 'content' part to be +a file, prefix the file name with an @ sign. To just get the content part from +a file, prefix the file name with the symbol <. The difference between @ and < +is then that @ makes a file get attached in the post as a file upload, while +the < makes a text field and just get the contents for that text field from a +file. + +Tell curl to read content from stdin instead of a file by using - as +filename. This goes for both @ and < constructs. When stdin is used, the +contents is buffered in memory first by curl to determine its size and allow a +possible resend. Defining a part's data from a named non-regular file (such +as a named pipe or similar) is unfortunately not subject to buffering and will +be effectively read at transmission time; since the full size is unknown +before the transfer starts, such data is sent as chunks by HTTP and rejected +by IMAP. + +Example: send an image to an HTTP server, where \&'profile' is the name of the +form-field to which the file portrait.jpg will be the input: + + curl -F profile=@portrait.jpg https://example.com/upload.cgi + +Example: send your name and shoe size in two text fields to the server: + + curl -F name=John -F shoesize=11 https://example.com/ + +Example: send your essay in a text field to the server. Send it as a plain +text field, but get the contents for it from a local file: + + curl -F "story=HTML message;type=text/html' \\ +.br + -F '=)' -F '=@textfile.txt' ... smtp://example.com + +Data can be encoded for transfer using encoder=. Available encodings are +\fIbinary\fP and \fI8bit\fP that do nothing else than adding the corresponding +Content-Transfer-Encoding header, \fI7bit\fP that only rejects 8-bit characters +with a transfer error, \fIquoted-printable\fP and \fIbase64\fP that encodes +data according to the corresponding schemes, limiting lines length to +76 characters. + +Example: send multipart mail with a quoted-printable text message and a +base64 attached file: + + curl -F '=text message;encoder=quoted-printable' \\ +.br + -F '=@localfile;encoder=base64' ... smtp://example.com + +See further examples and details in the MANUAL. + +This option can be used multiple times. diff --git a/docs/cmdline-opts/ftp-account.d b/docs/cmdline-opts/ftp-account.d new file mode 100644 index 0000000000..013c4f37b2 --- /dev/null +++ b/docs/cmdline-opts/ftp-account.d @@ -0,0 +1,10 @@ +Long: ftp-account +Arg: +Help: Account data string +Protocols: FTP +Added: 7.13.0 +--- +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. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/ftp-alternative-to-user.d b/docs/cmdline-opts/ftp-alternative-to-user.d new file mode 100644 index 0000000000..8982ba8b85 --- /dev/null +++ b/docs/cmdline-opts/ftp-alternative-to-user.d @@ -0,0 +1,10 @@ +Long: ftp-alternative-to-user +Arg: +Help: String to replace USER [name] +Protocols: FTP +Added: 7.15.5 +--- +If authenticating with the USER and PASS commands fails, send this command. +When connecting to Tumbleweed's Secure Transport server over FTPS using a +client certificate, using "SITE AUTH" will tell the server to retrieve the +username from the certificate. diff --git a/docs/cmdline-opts/ftp-create-dirs.d b/docs/cmdline-opts/ftp-create-dirs.d new file mode 100644 index 0000000000..ede57100d1 --- /dev/null +++ b/docs/cmdline-opts/ftp-create-dirs.d @@ -0,0 +1,8 @@ +Long: ftp-create-dirs +Protocols: FTP SFTP +Help: Create the remote dirs if not present +See-also: create-dirs +--- +When an FTP or SFTP URL/operation uses a path that doesn't currently exist on +the server, the standard behavior of curl is to fail. Using this option, curl +will instead attempt to create missing directories. diff --git a/docs/cmdline-opts/ftp-method.d b/docs/cmdline-opts/ftp-method.d new file mode 100644 index 0000000000..95aa522e82 --- /dev/null +++ b/docs/cmdline-opts/ftp-method.d @@ -0,0 +1,21 @@ +Long: ftp-method +Arg: +Help: Control CWD usage +Protocols: FTP +Added: 7.15.1 +--- +Control what method curl should use to reach a file on an FTP(S) +server. The method argument should be one of the following alternatives: +.RS +.IP multicwd +curl does a single CWD operation for each path part in the given URL. For deep +hierarchies this means very many commands. This is how RFC 1738 says it should +be done. This is the default but the slowest behavior. +.IP nocwd +curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full +path to the server for all these commands. This is the fastest behavior. +.IP singlecwd +curl 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 diff --git a/docs/cmdline-opts/ftp-pasv.d b/docs/cmdline-opts/ftp-pasv.d new file mode 100644 index 0000000000..44103e21a3 --- /dev/null +++ b/docs/cmdline-opts/ftp-pasv.d @@ -0,0 +1,16 @@ +Long: ftp-pasv +Help: Use PASV/EPSV instead of PORT +Protocols: FTP +Added: 7.11.0 +See-also: disable-epsv +--- +Use passive mode for the data connection. Passive is the internal default +behavior, but using this option can be used to override a previous --ftp-port +option. + +If this option is used several times, only the first one is used. Undoing an +enforced passive really isn't doable but you must then instead enforce the +correct --ftp-port again. + +Passive mode means that curl will try the EPSV command first and then PASV, +unless --disable-epsv is used. diff --git a/docs/cmdline-opts/ftp-port.d b/docs/cmdline-opts/ftp-port.d new file mode 100644 index 0000000000..e4b1456082 --- /dev/null +++ b/docs/cmdline-opts/ftp-port.d @@ -0,0 +1,32 @@ +Long: ftp-port +Arg:
+Help: Use PORT instead of PASV +Short: P +Protocols: FTP +See-also: ftp-pasv disable-eprt +--- +Reverses the default initiator/listener roles when connecting with FTP. This +option makes curl use active mode. curl then tells the server to connect back +to the client's specified address and port, while passive mode asks the server +to setup an IP address and port for it to connect to.
should be one +of: +.RS +.IP interface +e.g. "eth0" to specify which interface's IP address you want to use (Unix only) +.IP "IP address" +e.g. "192.168.10.1" to specify the exact IP address +.IP "host name" +e.g. "my.host.domain" to specify the machine +.IP "-" +make curl pick the same IP address that is already used for the control +connection +.RE + +If this option is used several times, the last one will be used. Disable the +use of PORT with --ftp-pasv. Disable the attempt to use the EPRT command +instead of PORT by using --disable-eprt. EPRT is really PORT++. + +Since 7.19.5, you can append \&":[start]-[end]\&" to the right of the address, +to tell curl what TCP port range to use. That means you specify a port range, +from a lower to a higher number. A single number works as well, but do note +that it increases the risk of failure since the port may not be available. diff --git a/docs/cmdline-opts/ftp-pret.d b/docs/cmdline-opts/ftp-pret.d new file mode 100644 index 0000000000..dac4c35319 --- /dev/null +++ b/docs/cmdline-opts/ftp-pret.d @@ -0,0 +1,8 @@ +Long: ftp-pret +Help: Send PRET before PASV +Protocols: FTP +Added: 7.20.0 +--- +Tell 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. diff --git a/docs/cmdline-opts/ftp-skip-pasv-ip.d b/docs/cmdline-opts/ftp-skip-pasv-ip.d new file mode 100644 index 0000000000..da6ab11fc7 --- /dev/null +++ b/docs/cmdline-opts/ftp-skip-pasv-ip.d @@ -0,0 +1,12 @@ +Long: ftp-skip-pasv-ip +Help: Skip the IP address for PASV +Protocols: FTP +Added: 7.14.2 +See-also: ftp-pasv +--- +Tell curl to not use the IP address the server suggests in its response +to curl's PASV command when curl connects the data connection. Instead curl +will re-use the same IP address it already uses for the control +connection. + +This option has no effect if PORT, EPRT or EPSV is used instead of PASV. diff --git a/docs/cmdline-opts/ftp-ssl-ccc-mode.d b/docs/cmdline-opts/ftp-ssl-ccc-mode.d new file mode 100644 index 0000000000..be10294985 --- /dev/null +++ b/docs/cmdline-opts/ftp-ssl-ccc-mode.d @@ -0,0 +1,11 @@ +Long: ftp-ssl-ccc-mode +Arg: +Help: Set CCC mode +Protocols: FTP +Added: 7.16.2 +See-also: ftp-ssl-ccc +--- +Sets the CCC mode. The passive mode will not initiate the shutdown, but +instead wait for the server to do it, and will not reply to the shutdown from +the server. The active mode initiates the shutdown and waits for a reply from +the server. diff --git a/docs/cmdline-opts/ftp-ssl-ccc.d b/docs/cmdline-opts/ftp-ssl-ccc.d new file mode 100644 index 0000000000..c6edc5b395 --- /dev/null +++ b/docs/cmdline-opts/ftp-ssl-ccc.d @@ -0,0 +1,10 @@ +Long: ftp-ssl-ccc +Help: Send CCC after authenticating +Protocols: FTP +See-also: ssl ftp-ssl-ccc-mode +Added: 7.16.1 +--- +Use CCC (Clear Command Channel) 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. The +default mode is passive. diff --git a/docs/cmdline-opts/ftp-ssl-control.d b/docs/cmdline-opts/ftp-ssl-control.d new file mode 100644 index 0000000000..87a822531d --- /dev/null +++ b/docs/cmdline-opts/ftp-ssl-control.d @@ -0,0 +1,8 @@ +Long: ftp-ssl-control +Help: Require SSL/TLS for FTP login, clear for transfer +Protocols: FTP +Added: 7.16.0 +--- +Require SSL/TLS for the FTP login, clear for transfer. Allows secure +authentication, but non-encrypted data transfers for efficiency. Fails the +transfer if the server doesn't support SSL/TLS. diff --git a/docs/cmdline-opts/gen.pl b/docs/cmdline-opts/gen.pl new file mode 100755 index 0000000000..a921298a64 --- /dev/null +++ b/docs/cmdline-opts/gen.pl @@ -0,0 +1,390 @@ +#!/usr/bin/env perl + +=begin comment + +This script generates the manpage. + +Example: gen.pl mainpage > curl.1 + +Dev notes: + +We open *input* files in :crlf translation (a no-op on many platforms) in +case we have CRLF line endings in Windows but a perl that defaults to LF. +Unfortunately it seems some perls like msysgit can't handle a global input-only +:crlf so it has to be specified on each file open for text input. + +=end comment +=cut + +my $some_dir=$ARGV[1] || "."; + +opendir(my $dh, $some_dir) || die "Can't opendir $some_dir: $!"; +my @s = grep { /\.d$/ && -f "$some_dir/$_" } readdir($dh); +closedir $dh; + +my %optshort; +my %optlong; +my %helplong; +my %arglong; +my %redirlong; +my %protolong; + +# get the long name version, return the man page string +sub manpageify { + my ($k)=@_; + my $l; + if($optlong{$k} ne "") { + # both short + long + $l = "\\fI-".$optlong{$k}.", --$k\\fP"; + } + else { + # only long + $l = "\\fI--$k\\fP"; + } + return $l; +} + +sub printdesc { + my @desc = @_; + for my $d (@desc) { + # skip lines starting with space (examples) + if($d =~ /^[^ ]/) { + for my $k (keys %optlong) { + my $l = manpageify($k); + $d =~ s/--$k([^a-z0-9_-])/$l$1/; + } + } + print $d; + } +} + +sub seealso { + my($standalone, $data)=@_; + if($standalone) { + return sprintf + ".SH \"SEE ALSO\"\n$data\n"; + } + else { + return "See also $data. "; + } +} + +sub overrides { + my ($standalone, $data)=@_; + if($standalone) { + return ".SH \"OVERRIDES\"\n$data\n"; + } + else { + return $data; + } +} + +sub protocols { + my ($standalone, $data)=@_; + if($standalone) { + return ".SH \"PROTOCOLS\"\n$data\n"; + } + else { + return "($data) "; + } +} + +sub added { + my ($standalone, $data)=@_; + if($standalone) { + return ".SH \"ADDED\"\nAdded in curl version $data\n"; + } + else { + return "Added in $data. "; + } +} + +sub single { + my ($f, $standalone)=@_; + open(F, "<:crlf", "$some_dir/$f") || + return 1; + my $short; + my $long; + my $tags; + my $added; + my $protocols; + my $arg; + my $mutexed; + my $requires; + my $seealso; + my $magic; # cmdline special option + while() { + if(/^Short: *(.)/i) { + $short=$1; + } + elsif(/^Long: *(.*)/i) { + $long=$1; + } + elsif(/^Added: *(.*)/i) { + $added=$1; + } + elsif(/^Tags: *(.*)/i) { + $tags=$1; + } + elsif(/^Arg: *(.*)/i) { + $arg=$1; + } + elsif(/^Magic: *(.*)/i) { + $magic=$1; + } + elsif(/^Mutexed: *(.*)/i) { + $mutexed=$1; + } + elsif(/^Protocols: *(.*)/i) { + $protocols=$1; + } + elsif(/^See-also: *(.*)/i) { + $seealso=$1; + } + elsif(/^Requires: *(.*)/i) { + $requires=$1; + } + elsif(/^Help: *(.*)/i) { + ; + } + elsif(/^---/) { + if(!$long) { + print STDERR "WARN: no 'Long:' in $f\n"; + } + last; + } + else { + chomp; + print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';" + } + } + my @desc; + while() { + push @desc, $_; + } + close(F); + my $opt; + if(defined($short) && $long) { + $opt = "-$short, --$long"; + } + elsif($short && !$long) { + $opt = "-$short"; + } + elsif($long && !$short) { + $opt = "--$long"; + } + + if($arg) { + $opt .= " $arg"; + } + + if($standalone) { + print ".TH curl 1 \"30 Nov 2016\" \"curl 7.52.0\" \"curl manual\"\n"; + print ".SH OPTION\n"; + print "curl $opt\n"; + } + else { + print ".IP \"$opt\"\n"; + } + if($protocols) { + print protocols($standalone, $protocols); + } + + if($standalone) { + print ".SH DESCRIPTION\n"; + } + + printdesc(@desc); + undef @desc; + + my @foot; + if($seealso) { + my @m=split(/ /, $seealso); + my $mstr; + for my $k (@m) { + if(!$helplong{$k}) { + print STDERR "WARN: $f see-alsos a non-existing option: $k\n"; + } + my $l = manpageify($k); + $mstr .= sprintf "%s$l", $mstr?" and ":""; + } + push @foot, seealso($standalone, $mstr); + } + if($requires) { + my $l = manpageify($long); + push @foot, "$l requires that the underlying libcurl". + " was built to support $requires. "; + } + if($mutexed) { + my @m=split(/ /, $mutexed); + my $mstr; + for my $k (@m) { + if(!$helplong{$k}) { + print STDERR "WARN: $f mutexes a non-existing option: $k\n"; + } + my $l = manpageify($k); + $mstr .= sprintf "%s$l", $mstr?" and ":""; + } + push @foot, overrides($standalone, "This option overrides $mstr. "); + } + if($added) { + push @foot, added($standalone, $added); + } + if($foot[0]) { + print "\n"; + my $f = join("", @foot); + $f =~ s/ +\z//; # remove trailing space + print "$f\n"; + } + return 0; +} + +sub getshortlong { + my ($f)=@_; + open(F, "<:crlf", "$some_dir/$f"); + my $short; + my $long; + my $help; + my $arg; + my $protocols; + while() { + if(/^Short: (.)/i) { + $short=$1; + } + elsif(/^Long: (.*)/i) { + $long=$1; + } + elsif(/^Help: (.*)/i) { + $help=$1; + } + elsif(/^Arg: (.*)/i) { + $arg=$1; + } + elsif(/^Protocols: (.*)/i) { + $protocols=$1; + } + elsif(/^---/) { + last; + } + } + close(F); + if($short) { + $optshort{$short}=$long; + } + if($long) { + $optlong{$long}=$short; + $helplong{$long}=$help; + $arglong{$long}=$arg; + $protolong{$long}=$protocols; + } +} + +sub indexoptions { + foreach my $f (@s) { + getshortlong($f); + } +} + +sub header { + my ($f)=@_; + open(F, "<:crlf", "$some_dir/$f"); + my @d; + while() { + push @d, $_; + } + close(F); + printdesc(@d); +} + +sub listhelp { + foreach my $f (sort keys %helplong) { + my $long = $f; + my $short = $optlong{$long}; + my $opt; + + if(defined($short) && $long) { + $opt = "-$short, --$long"; + } + elsif($long && !$short) { + $opt = " --$long"; + } + + my $arg = $arglong{$long}; + if($arg) { + $opt .= " $arg"; + } + my $desc = $helplong{$f}; + $desc =~ s/\"/\\\"/g; # escape double quotes + + my $line = sprintf " {\"%s\",\n \"%s\"},\n", $opt, $desc; + + if(length($opt) + length($desc) > 78) { + print STDERR "WARN: the --$long line is too long\n"; + } + print $line; + } +} + +sub mainpage { + # show the page header + header("page-header"); + + # output docs for all options + foreach my $f (sort @s) { + single($f, 0); + } + + header("page-footer"); +} + +sub showonly { + my ($f) = @_; + if(single($f, 1)) { + print STDERR "$f: failed\n"; + } +} + +sub showprotocols { + my %prots; + foreach my $f (keys %optlong) { + my @p = split(/ /, $protolong{$f}); + for my $p (@p) { + $prots{$p}++; + } + } + for(sort keys %prots) { + printf "$_ (%d options)\n", $prots{$_}; + } +} + +sub getargs { + my $f; + do { + $f = shift @ARGV; + if($f eq "mainpage") { + mainpage(); + return; + } + elsif($f eq "listhelp") { + listhelp(); + return; + } + elsif($f eq "single") { + showonly(shift @ARGV); + return; + } + elsif($f eq "protos") { + showprotocols(); + return; + } + } while($f); + + print "Usage: gen.pl [srcdir]\n"; +} + +#------------------------------------------------------------------------ + +# learn all existing options +indexoptions(); + +getargs(); diff --git a/docs/cmdline-opts/get.d b/docs/cmdline-opts/get.d new file mode 100644 index 0000000000..be7cb25f0c --- /dev/null +++ b/docs/cmdline-opts/get.d @@ -0,0 +1,15 @@ +Long: get +Short: G +Help: Put the post data in the URL and use GET +--- +When used, this option will make all data specified with --data, --data-binary +or --data-urlencode to be used in an HTTP GET request instead of the POST +request that otherwise would be used. The data will be appended to the URL +with a '?' separator. + +If used in combination with --head, the POST data will instead be appended to +the URL with a HEAD request. + +If this option is used several times, only the first one is used. This is +because undoing a GET doesn't make sense, but you should then instead enforce +the alternative method you prefer. diff --git a/docs/cmdline-opts/globoff.d b/docs/cmdline-opts/globoff.d new file mode 100644 index 0000000000..fff6516b6d --- /dev/null +++ b/docs/cmdline-opts/globoff.d @@ -0,0 +1,8 @@ +Long: globoff +Short: g +Help: Disable URL sequences and ranges using {} and [] +--- +This option switches off the "URL globbing parser". When you set this option, +you can specify URLs that contain the letters {}[] without having them being +interpreted by curl itself. Note that these letters are not normal legal URL +contents but they should be encoded according to the URI standard. diff --git a/docs/cmdline-opts/happy-eyeballs-timeout-ms.d b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d new file mode 100644 index 0000000000..ec9a8c228f --- /dev/null +++ b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d @@ -0,0 +1,17 @@ +Long: happy-eyeballs-timeout-ms +Arg: +Help: How long to wait in milliseconds for IPv6 before trying IPv4 +Added: 7.59.0 +--- +Happy eyeballs is an algorithm that attempts to connect to both IPv4 and IPv6 +addresses for dual-stack hosts, preferring IPv6 first for the number of +milliseconds. If the IPv6 address cannot be connected to within that time then +a connection attempt is made to the IPv4 address in parallel. The first +connection to be established is the one that is used. + +The range of suggested useful values is limited. Happy Eyeballs RFC 6555 says +"It is RECOMMENDED that connection attempts be paced 150-250 ms apart to +balance human factors against network load." libcurl currently defaults to +200 ms. Firefox and Chrome currently default to 300 ms. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/haproxy-protocol.d b/docs/cmdline-opts/haproxy-protocol.d new file mode 100644 index 0000000000..cc41c9c447 --- /dev/null +++ b/docs/cmdline-opts/haproxy-protocol.d @@ -0,0 +1,11 @@ +Long: haproxy-protocol +Help: Send HAProxy PROXY protocol v1 header +Protocols: HTTP +Added: 7.60.0 +--- +Send a HAProxy PROXY protocol v1 header at the beginning of the connection. This +is used by some load balancers and reverse proxies to indicate the client's +true IP address and port. + +This option is primarily useful when sending test requests to a service that +expects this header. diff --git a/docs/cmdline-opts/head.d b/docs/cmdline-opts/head.d new file mode 100644 index 0000000000..350a100f65 --- /dev/null +++ b/docs/cmdline-opts/head.d @@ -0,0 +1,8 @@ +Long: head +Short: I +Help: Show document info only +Protocols: HTTP FTP FILE +--- +Fetch the headers only! HTTP-servers feature the command HEAD which this uses +to get nothing but the header of a document. When used on an FTP or FILE file, +curl displays the file size and last modification time only. diff --git a/docs/cmdline-opts/header.d b/docs/cmdline-opts/header.d new file mode 100644 index 0000000000..d8292ed775 --- /dev/null +++ b/docs/cmdline-opts/header.d @@ -0,0 +1,41 @@ +Long: header +Short: H +Arg:
+Help: Pass custom header(s) to server +Protocols: HTTP +--- +Extra header to include in the request when sending HTTP to a server. You may +specify any number of extra headers. Note that if you should add a custom +header that has the same name as one of the internal ones curl would use, your +externally set header will be used instead of the internal one. This allows +you to make even trickier stuff than curl would normally do. You should not +replace internally set headers without knowing perfectly well what you're +doing. Remove an internal header by giving a replacement without content on +the right side of the colon, as in: -H \&"Host:". If you send the custom +header with no-value then its header must be terminated with a semicolon, such +as \-H \&"X-Custom-Header;" to send "X-Custom-Header:". + +curl will make sure that each header you add/replace is sent with the proper +end-of-line marker, you should thus \fBnot\fP add that as a part of the header +content: do not add newlines or carriage returns, they will only mess things up +for you. + +Starting in 7.55.0, this option can take an argument in @filename style, which +then adds a header for each line in the input file. Using @- will make curl +read the header file from stdin. + +See also the --user-agent and --referer options. + +Starting in 7.37.0, you need --proxy-header to send custom headers intended +for a proxy. + +Example: + + curl -H "X-First-Name: Joe" http://example.com/ + +\fBWARNING\fP: headers set with this option will be set in all requests - even +after redirects are followed, like when told with --location. This can lead to +the header being sent to other hosts than the original host, so sensitive +headers should be used with caution combined with following redirects. + +This option can be used multiple times to add/replace/remove multiple headers. diff --git a/docs/cmdline-opts/help.d b/docs/cmdline-opts/help.d new file mode 100644 index 0000000000..64aa696d47 --- /dev/null +++ b/docs/cmdline-opts/help.d @@ -0,0 +1,6 @@ +Long: help +Short: h +Help: This help text +--- +Usage help. This lists all current command line options with a short +description. diff --git a/docs/cmdline-opts/hostpubmd5.d b/docs/cmdline-opts/hostpubmd5.d new file mode 100644 index 0000000000..a851158031 --- /dev/null +++ b/docs/cmdline-opts/hostpubmd5.d @@ -0,0 +1,9 @@ +Long: hostpubmd5 +Arg: +Help: Acceptable MD5 hash of the host public key +Protocols: SFTP SCP +Added: 7.17.1 +--- +Pass a string containing 32 hexadecimal digits. The string should +be the 128 bit MD5 checksum of the remote host's public key, curl will refuse +the connection with the host unless the md5sums match. diff --git a/docs/cmdline-opts/http0.9.d b/docs/cmdline-opts/http0.9.d new file mode 100644 index 0000000000..7e783f696b --- /dev/null +++ b/docs/cmdline-opts/http0.9.d @@ -0,0 +1,13 @@ +Long: http0.9 +Tags: Versions +Protocols: HTTP +Added: +Help: Allow HTTP 0.9 responses +--- +Tells curl to be fine with HTTP version 0.9 response. + +HTTP/0.9 is a completely headerless response and therefore you can also +connect with this to non-HTTP servers and still get a response since curl will +simply transparently downgrade - if allowed. + +Since curl 7.66.0, HTTP/0.9 is disabled by default. diff --git a/docs/cmdline-opts/http1.0.d b/docs/cmdline-opts/http1.0.d new file mode 100644 index 0000000000..d9bbd76f0f --- /dev/null +++ b/docs/cmdline-opts/http1.0.d @@ -0,0 +1,10 @@ +Short: 0 +Long: http1.0 +Tags: Versions +Protocols: HTTP +Added: +Mutexed: http1.1 http2 +Help: Use HTTP 1.0 +--- +Tells curl to use HTTP version 1.0 instead of using its internally preferred +HTTP version. diff --git a/docs/cmdline-opts/http1.1.d b/docs/cmdline-opts/http1.1.d new file mode 100644 index 0000000000..f1e6b5c3bc --- /dev/null +++ b/docs/cmdline-opts/http1.1.d @@ -0,0 +1,8 @@ +Long: http1.1 +Tags: Versions +Protocols: HTTP +Added: 7.33.0 +Mutexed: http1.0 http2 +Help: Use HTTP 1.1 +--- +Tells curl to use HTTP version 1.1. diff --git a/docs/cmdline-opts/http2-prior-knowledge.d b/docs/cmdline-opts/http2-prior-knowledge.d new file mode 100644 index 0000000000..f793f775dd --- /dev/null +++ b/docs/cmdline-opts/http2-prior-knowledge.d @@ -0,0 +1,12 @@ +Long: http2-prior-knowledge +Tags: Versions +Protocols: HTTP +Added: 7.49.0 +Mutexed: http1.1 http1.0 http2 +Requires: HTTP/2 +Help: Use HTTP 2 without HTTP/1.1 Upgrade +--- +Tells curl to issue its non-TLS HTTP requests using HTTP/2 without HTTP/1.1 +Upgrade. It requires prior knowledge that the server supports HTTP/2 straight +away. HTTPS requests will still do HTTP/2 the standard way with negotiated +protocol version in the TLS handshake. diff --git a/docs/cmdline-opts/http2.d b/docs/cmdline-opts/http2.d new file mode 100644 index 0000000000..cf8f2988e6 --- /dev/null +++ b/docs/cmdline-opts/http2.d @@ -0,0 +1,11 @@ +Long: http2 +Tags: Versions +Protocols: HTTP +Added: 7.33.0 +Mutexed: http1.1 http1.0 http2-prior-knowledge +Requires: HTTP/2 +See-also: no-alpn +Help: Use HTTP 2 +See-also: http1.1 http3 +--- +Tells curl to use HTTP version 2. diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d new file mode 100644 index 0000000000..8265937a3d --- /dev/null +++ b/docs/cmdline-opts/http3.d @@ -0,0 +1,19 @@ +Long: http3 +Tags: Versions +Protocols: HTTP +Added: 7.66.0 +Mutexed: http1.1 http1.0 http2 http2-prior-knowledge +Requires: HTTP/3 +Help: Use HTTP v3 +See-also: http1.1 http2 +--- + +WARNING: this option is experimental. Do not use in production. + +Tells curl to use HTTP version 3 directly to the host and port number used in +the URL. A normal HTTP/3 transaction will be done to a host and then get +redirected via Alt-SVc, but this option allows a user to circumvent that when +you know that the target speaks HTTP/3 on the given host and port. + +This option will make curl fail if a QUIC connection cannot be established, it +cannot fall back to a lower HTTP version on its own. diff --git a/docs/cmdline-opts/ignore-content-length.d b/docs/cmdline-opts/ignore-content-length.d new file mode 100644 index 0000000000..53524f5184 --- /dev/null +++ b/docs/cmdline-opts/ignore-content-length.d @@ -0,0 +1,10 @@ +Long: ignore-content-length +Help: Ignore the size of the remote resource +Protocols: FTP HTTP +--- +For HTTP, Ignore the Content-Length header. This is particularly useful for +servers running Apache 1.x, which will report incorrect Content-Length for +files larger than 2 gigabytes. + +For FTP (since 7.46.0), skip the RETR command to figure out the size before +downloading a file. diff --git a/docs/cmdline-opts/include.d b/docs/cmdline-opts/include.d new file mode 100644 index 0000000000..9d282dd162 --- /dev/null +++ b/docs/cmdline-opts/include.d @@ -0,0 +1,10 @@ +Long: include +Short: i +Help: Include protocol response headers in the output +See-also: verbose +--- +Include the HTTP response headers in the output. The HTTP response headers can +include things like server name, cookies, date of the document, HTTP version +and more... + +To view the request headers, consider the --verbose option. diff --git a/docs/cmdline-opts/insecure.d b/docs/cmdline-opts/insecure.d new file mode 100644 index 0000000000..49b0a43228 --- /dev/null +++ b/docs/cmdline-opts/insecure.d @@ -0,0 +1,16 @@ +Long: insecure +Short: k +Help: Allow insecure server connections when using SSL +Protocols: TLS +See-also: proxy-insecure cacert +--- + +By default, every SSL connection curl makes is verified to be secure. This +option allows curl to proceed and operate even for server connections +otherwise considered insecure. + +The server connection is verified by making sure the server's certificate +contains the right name and verifies successfully using the cert store. + +See this online resource for further details: + https://curl.haxx.se/docs/sslcerts.html diff --git a/docs/cmdline-opts/interface.d b/docs/cmdline-opts/interface.d new file mode 100644 index 0000000000..65827fb8be --- /dev/null +++ b/docs/cmdline-opts/interface.d @@ -0,0 +1,16 @@ +Long: interface +Arg: +Help: Use network INTERFACE (or address) +See-also: dns-interface +--- + +Perform an operation using a specified interface. You can enter interface +name, IP address or host name. An example could look like: + + curl --interface eth0:1 https://www.example.com/ + +If this option is used several times, the last one will be used. + +On Linux it can be used to specify a VRF, but the binary needs to either +have CAP_NET_RAW or to be run as root. More information about Linux VRF: +https://www.kernel.org/doc/Documentation/networking/vrf.txt diff --git a/docs/cmdline-opts/ipv4.d b/docs/cmdline-opts/ipv4.d new file mode 100644 index 0000000000..9c40c8c3ee --- /dev/null +++ b/docs/cmdline-opts/ipv4.d @@ -0,0 +1,12 @@ +Short: 4 +Long: ipv4 +Tags: Versions +Protocols: +Added: +Mutexed: ipv6 +Requires: +See-also: http1.1 http2 +Help: Resolve names to IPv4 addresses +--- +This option tells curl to resolve names to IPv4 addresses only, and not for +example try IPv6. diff --git a/docs/cmdline-opts/ipv6.d b/docs/cmdline-opts/ipv6.d new file mode 100644 index 0000000000..6eef6dd03b --- /dev/null +++ b/docs/cmdline-opts/ipv6.d @@ -0,0 +1,12 @@ +Short: 6 +Long: ipv6 +Tags: Versions +Protocols: +Added: +Mutexed: ipv4 +Requires: +See-also: http1.1 http2 +Help: Resolve names to IPv6 addresses +--- +This option tells curl to resolve names to IPv6 addresses only, and not for +example try IPv4. diff --git a/docs/cmdline-opts/junk-session-cookies.d b/docs/cmdline-opts/junk-session-cookies.d new file mode 100644 index 0000000000..40ccd9c2df --- /dev/null +++ b/docs/cmdline-opts/junk-session-cookies.d @@ -0,0 +1,10 @@ +Long: junk-session-cookies +Short: j +Help: Ignore session cookies read from file +Protocols: HTTP +See-also: cookie cookie-jar +--- +When curl is told to read cookies from a given file, this option will make it +discard all "session cookies". This will basically have the same effect as if +a new session is started. Typical browsers always discard session cookies when +they're closed down. diff --git a/docs/cmdline-opts/keepalive-time.d b/docs/cmdline-opts/keepalive-time.d new file mode 100644 index 0000000000..c816e13ff0 --- /dev/null +++ b/docs/cmdline-opts/keepalive-time.d @@ -0,0 +1,13 @@ +Long: keepalive-time +Arg: +Help: Interval time for keepalive probes +Added: 7.18.0 +--- +This option sets the time a connection needs to remain idle before sending +keepalive probes and the time between individual keepalive probes. It is +currently effective on operating systems offering the TCP_KEEPIDLE and +TCP_KEEPINTVL socket options (meaning Linux, recent AIX, HP-UX and more). This +option has no effect if --no-keepalive is used. + +If this option is used several times, the last one will be used. If +unspecified, the option defaults to 60 seconds. diff --git a/docs/cmdline-opts/key-type.d b/docs/cmdline-opts/key-type.d new file mode 100644 index 0000000000..bf39bcd357 --- /dev/null +++ b/docs/cmdline-opts/key-type.d @@ -0,0 +1,9 @@ +Long: key-type +Arg: +Help: Private key file type (DER/PEM/ENG) +Protocols: TLS +--- +Private key file type. Specify which type your --key provided private key +is. DER, PEM, and ENG are supported. If not specified, PEM is assumed. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/key.d b/docs/cmdline-opts/key.d new file mode 100644 index 0000000000..855e2f7b6b --- /dev/null +++ b/docs/cmdline-opts/key.d @@ -0,0 +1,17 @@ +Long: key +Arg: +Protocols: TLS SSH +Help: Private key file name +--- +Private key file name. Allows you to provide your private key in this separate +file. For SSH, if not specified, curl tries the following candidates in order: +\&'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'. + +If curl is built against OpenSSL library, and the engine pkcs11 is available, +then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a +PKCS#11 device. A string beginning with "pkcs11:" will be interpreted as a +PKCS#11 URI. If a PKCS#11 URI is provided, then the --engine option will be set +as "pkcs11" if none was provided and the --key-type option will be set as +"ENG" if none was provided. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/krb.d b/docs/cmdline-opts/krb.d new file mode 100644 index 0000000000..19547af080 --- /dev/null +++ b/docs/cmdline-opts/krb.d @@ -0,0 +1,11 @@ +Long: krb +Arg: +Help: Enable Kerberos with security +Protocols: FTP +Requires: Kerberos +--- +Enable Kerberos authentication and use. The level must be entered and should +be one of 'clear', 'safe', 'confidential', or 'private'. Should you use a +level that is not one of these, 'private' will instead be used. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/libcurl.d b/docs/cmdline-opts/libcurl.d new file mode 100644 index 0000000000..ef132fe745 --- /dev/null +++ b/docs/cmdline-opts/libcurl.d @@ -0,0 +1,11 @@ +Long: libcurl +Arg: +Help: Dump libcurl equivalent code of this command line +Added: 7.16.1 +--- +Append this option to any ordinary curl command line, and you will get a +libcurl-using C source code written to the file that does the equivalent +of what your command-line operation does! + +If this option is used several times, the last given file name will be +used. diff --git a/docs/cmdline-opts/limit-rate.d b/docs/cmdline-opts/limit-rate.d new file mode 100644 index 0000000000..06c456e3e7 --- /dev/null +++ b/docs/cmdline-opts/limit-rate.d @@ -0,0 +1,18 @@ +Long: limit-rate +Arg: +Help: Limit transfer speed to RATE +--- +Specify the maximum transfer rate you want curl to use - for both downloads +and uploads. This feature is useful if you have a limited pipe and you'd like +your transfer not to use your entire bandwidth. To make it slower than it +otherwise would be. + +The given speed is measured in bytes/second, unless a suffix is appended. +Appending 'k' or 'K' will count the number as kilobytes, 'm' or 'M' makes it +megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and 1G. + +If you also use the --speed-limit option, that option will take precedence and +might cripple the rate-limiting slightly, to help keeping the speed-limit +logic working. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/list-only.d b/docs/cmdline-opts/list-only.d new file mode 100644 index 0000000000..4c56304a0d --- /dev/null +++ b/docs/cmdline-opts/list-only.d @@ -0,0 +1,24 @@ +Long: list-only +Short: l +Protocols: FTP POP3 +Help: List only mode +Added: 7.21.5 +--- +(FTP) +When listing an FTP directory, this switch forces a name-only view. This is +especially useful if the user wants to machine-parse the contents of an FTP +directory since the normal directory view doesn't use a standard look or +format. When used like this, the option causes a NLST command to be sent to +the server instead of LIST. + +Note: Some FTP servers list only files in their response to NLST; they do not +include sub-directories and symbolic links. + +(POP3) +When retrieving a specific email from POP3, this switch forces a LIST command +to be performed instead of RETR. This is particularly useful if the user wants +to see if a specific message id exists on the server and what size it is. + +Note: When combined with --request, this option can be used to send an UIDL +command instead, so the user may use the email's unique identifier rather than +it's message id to make the request. diff --git a/docs/cmdline-opts/local-port.d b/docs/cmdline-opts/local-port.d new file mode 100644 index 0000000000..d96b46eb89 --- /dev/null +++ b/docs/cmdline-opts/local-port.d @@ -0,0 +1,9 @@ +Long: local-port +Arg: +Help: Force use of RANGE for local port numbers +Added: 7.15.2 +--- +Set a preferred single number or range (FROM-TO) of local port numbers to use +for the connection(s). Note that port numbers by nature are a scarce resource +that will be busy at times so setting this range to something too narrow might +cause unnecessary connection setup failures. diff --git a/docs/cmdline-opts/location-trusted.d b/docs/cmdline-opts/location-trusted.d new file mode 100644 index 0000000000..995a8718aa --- /dev/null +++ b/docs/cmdline-opts/location-trusted.d @@ -0,0 +1,9 @@ +Long: location-trusted +Help: Like --location, and send auth to other hosts +Protocols: HTTP +See-also: user +--- +Like --location, but will allow sending the name + password to all hosts that +the site may redirect to. This may or may not introduce a security breach if +the site redirects you to a site to which you'll send your authentication info +(which is plaintext in the case of HTTP Basic authentication). diff --git a/docs/cmdline-opts/location.d b/docs/cmdline-opts/location.d new file mode 100644 index 0000000000..b5ba1f4faa --- /dev/null +++ b/docs/cmdline-opts/location.d @@ -0,0 +1,25 @@ +Long: location +Short: L +Help: Follow redirects +Protocols: HTTP +--- +If the server reports that the requested page has moved to a different +location (indicated with a Location: header and a 3XX response code), this +option will make curl redo the request on the new place. If used together with +--include or --head, headers from all requested pages will be shown. When +authentication is used, curl only sends its credentials to the initial +host. If a redirect takes curl to a different host, it won't be able to +intercept the user+password. See also --location-trusted on how to change +this. You can limit the amount of redirects to follow by using the +--max-redirs option. + +When curl follows a redirect and if the request is a POST, it will do the +following request with a GET if the HTTP response was 301, 302, or 303. If the +response code was any other 3xx code, curl will re-send the following request +using the same unmodified method. + +You can tell curl to not change POST requests to GET after a 30x response by +using the dedicated options for that: --post301, --post302 and --post303. + +The method set with --request overrides the method curl would otherwise select +to use. diff --git a/docs/cmdline-opts/login-options.d b/docs/cmdline-opts/login-options.d new file mode 100644 index 0000000000..8bad0511d4 --- /dev/null +++ b/docs/cmdline-opts/login-options.d @@ -0,0 +1,14 @@ +Long: login-options +Arg: +Protocols: IMAP POP3 SMTP +Help: Server login options +Added: 7.34.0 +--- +Specify the login options to use during server authentication. + +You can use the login options to specify protocol specific options that may +be used during authentication. At present only IMAP, POP3 and SMTP support +login options. For more information about the login options please see +RFC 2384, RFC 5092 and IETF draft draft-earhart-url-smtp-00.txt + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/mail-auth.d b/docs/cmdline-opts/mail-auth.d new file mode 100644 index 0000000000..70cf0eda46 --- /dev/null +++ b/docs/cmdline-opts/mail-auth.d @@ -0,0 +1,10 @@ +Long: mail-auth +Arg:
+Protocols: SMTP +Help: Originator address of the original email +Added: 7.25.0 +See-also: mail-rcpt mail-from +--- +Specify a single address. This will be used to specify the authentication +address (identity) of a submitted message that is being relayed to another +server. diff --git a/docs/cmdline-opts/mail-from.d b/docs/cmdline-opts/mail-from.d new file mode 100644 index 0000000000..1d932344cf --- /dev/null +++ b/docs/cmdline-opts/mail-from.d @@ -0,0 +1,8 @@ +Long: mail-from +Arg:
+Help: Mail from this address +Protocols: SMTP +Added: 7.20.0 +See-also: mail-rcpt mail-auth +--- +Specify a single address that the given mail should get sent from. diff --git a/docs/cmdline-opts/mail-rcpt-allowfails.d b/docs/cmdline-opts/mail-rcpt-allowfails.d new file mode 100644 index 0000000000..b5723df346 --- /dev/null +++ b/docs/cmdline-opts/mail-rcpt-allowfails.d @@ -0,0 +1,15 @@ +Long: mail-rcpt-allowfails +Help: Allow RCPT TO command to fail for some recipients +Protocols: SMTP +Added: 7.69.0 +--- +When sending data to multiple recipients, by default curl will abort SMTP +conversation if at least one of the recipients causes RCPT TO command to +return an error. + +The default behavior can be changed by passing --mail-rcpt-allowfails +command-line option which will make curl ignore errors and proceed with the +remaining valid recipients. + +In case when all recipients cause RCPT TO command to fail, curl will abort SMTP +conversation and return the error received from to the last RCPT TO command. \ No newline at end of file diff --git a/docs/cmdline-opts/mail-rcpt.d b/docs/cmdline-opts/mail-rcpt.d new file mode 100644 index 0000000000..0a2859b688 --- /dev/null +++ b/docs/cmdline-opts/mail-rcpt.d @@ -0,0 +1,19 @@ +Long: mail-rcpt +Arg:
+Help: Mail to this address +Protocols: SMTP +Added: 7.20.0 +--- +Specify a single address, user name or mailing list name. Repeat this +option several times to send to multiple recipients. + +When performing a mail transfer, the recipient should specify a valid email +address to send the mail to. + +When performing an address verification (VRFY command), the recipient should be +specified as the user name or user name and domain (as per Section 3.5 of +RFC5321). (Added in 7.34.0) + +When performing a mailing list expand (EXPN command), the recipient should be +specified using the mailing list name, such as "Friends" or "London-Office". +(Added in 7.34.0) diff --git a/docs/cmdline-opts/manual.d b/docs/cmdline-opts/manual.d new file mode 100644 index 0000000000..a9dbb0c78a --- /dev/null +++ b/docs/cmdline-opts/manual.d @@ -0,0 +1,5 @@ +Long: manual +Short: M +Help: Display the full manual +--- +Manual. Display the huge help text. diff --git a/docs/cmdline-opts/max-filesize.d b/docs/cmdline-opts/max-filesize.d new file mode 100644 index 0000000000..50d5266e1b --- /dev/null +++ b/docs/cmdline-opts/max-filesize.d @@ -0,0 +1,16 @@ +Long: max-filesize +Arg: +Help: Maximum file size to download +See-also: limit-rate +--- +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 curl will +return with exit code 63. + +A size modifier may be used. For example, Appending 'k' or 'K' will count the +number as kilobytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it +gigabytes. Examples: 200K, 3m and 1G. (Added in 7.58.0) + +\fBNOTE:\fP 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. diff --git a/docs/cmdline-opts/max-redirs.d b/docs/cmdline-opts/max-redirs.d new file mode 100644 index 0000000000..a97860a8bd --- /dev/null +++ b/docs/cmdline-opts/max-redirs.d @@ -0,0 +1,10 @@ +Long: max-redirs +Arg: +Help: Maximum number of redirects allowed +Protocols: HTTP +--- +Set maximum number of redirection-followings allowed. When --location is used, +is used to prevent curl from following redirections too much. By default, the +limit is set to 50 redirections. Set this option to -1 to make it unlimited. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/max-time.d b/docs/cmdline-opts/max-time.d new file mode 100644 index 0000000000..0057f9d047 --- /dev/null +++ b/docs/cmdline-opts/max-time.d @@ -0,0 +1,13 @@ +Long: max-time +Short: m +Arg: +Help: Maximum time allowed for the transfer +See-also: connect-timeout +--- +Maximum time in seconds that you allow the whole operation to take. This is +useful for preventing your batch jobs from hanging for hours due to slow +networks or links going down. Since 7.32.0, this option accepts decimal +values, but the actual timeout will decrease in accuracy as the specified +timeout increases in decimal precision. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/metalink.d b/docs/cmdline-opts/metalink.d new file mode 100644 index 0000000000..81fc8bc78c --- /dev/null +++ b/docs/cmdline-opts/metalink.d @@ -0,0 +1,26 @@ +Long: metalink +Help: Process given URLs as metalink XML file +Added: 7.27.0 +Requires: metalink +--- +This option can tell curl to parse and process a given URI as Metalink file +(both version 3 and 4 (RFC 5854) are supported) and make use of the mirrors +listed within for failover if there are errors (such as the file or server not +being available). It will also verify the hash of the file after the download +completes. The Metalink file itself is downloaded and processed in memory and +not stored in the local file system. + +Example to use a remote Metalink file: + + curl --metalink http://www.example.com/example.metalink + +To use a Metalink file in the local file system, use FILE protocol (file://): + + curl --metalink file://example.metalink + +Please note that if FILE protocol is disabled, there is no way to use a local +Metalink file at the time of this writing. Also note that if --metalink and +--include are used together, --include will be ignored. This is because +including headers in the response will break Metalink parser and if the +headers are included in the file described in Metalink file, hash check will +fail. diff --git a/docs/cmdline-opts/negotiate.d b/docs/cmdline-opts/negotiate.d new file mode 100644 index 0000000000..69a6b91709 --- /dev/null +++ b/docs/cmdline-opts/negotiate.d @@ -0,0 +1,15 @@ +Long: negotiate +Help: Use HTTP Negotiate (SPNEGO) authentication +Protocols: HTTP +See-also: basic ntlm anyauth proxy-negotiate +--- +Enables Negotiate (SPNEGO) authentication. + +This option requires a library built with GSS-API or SSPI support. Use +--version to see if your curl supports GSS-API/SSPI or SPNEGO. + +When using this option, you must also provide a fake --user option to activate +the authentication code properly. Sending a '-u :' is enough as the user name +and password from the --user option aren't actually used. + +If this option is used several times, only the first one is used. diff --git a/docs/cmdline-opts/netrc-file.d b/docs/cmdline-opts/netrc-file.d new file mode 100644 index 0000000000..50126d2554 --- /dev/null +++ b/docs/cmdline-opts/netrc-file.d @@ -0,0 +1,12 @@ +Long: netrc-file +Help: Specify FILE for netrc +Arg: +Added: 7.21.5 +Mutexed: netrc +--- +This option is similar to --netrc, except that you provide the path (absolute +or relative) to the netrc file that curl should use. You can only specify one +netrc file per invocation. If several --netrc-file options are provided, +the last one will be used. + +It will abide by --netrc-optional if specified. diff --git a/docs/cmdline-opts/netrc-optional.d b/docs/cmdline-opts/netrc-optional.d new file mode 100644 index 0000000000..c285403094 --- /dev/null +++ b/docs/cmdline-opts/netrc-optional.d @@ -0,0 +1,7 @@ +Long: netrc-optional +Help: Use either .netrc or URL +Mutexed: netrc +See-also: netrc-file +--- +Very similar to --netrc, but this option makes the .netrc usage \fBoptional\fP +and not mandatory as the --netrc option does. diff --git a/docs/cmdline-opts/netrc.d b/docs/cmdline-opts/netrc.d new file mode 100644 index 0000000000..2df26782cc --- /dev/null +++ b/docs/cmdline-opts/netrc.d @@ -0,0 +1,17 @@ +Long: netrc +Short: n +Help: Must read .netrc for user name and password +--- +Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's +home directory for login name and password. This is typically used for FTP on +Unix. If used with HTTP, curl will enable user authentication. See +\fInetrc(5)\fP \fIftp(1)\fP for details on the file format. Curl will not +complain if that file doesn't have the right permissions (it should not be +either world- or group-readable). The environment variable "HOME" is used to +find the home directory. + +A quick and very simple example of how to setup a \fI.netrc\fP to allow curl +to FTP to the machine host.domain.com with user name \&'myself' and password +\&'secret' should look similar to: + +.B "machine host.domain.com login myself password secret" diff --git a/docs/cmdline-opts/next.d b/docs/cmdline-opts/next.d new file mode 100644 index 0000000000..1d1e70a35c --- /dev/null +++ b/docs/cmdline-opts/next.d @@ -0,0 +1,20 @@ +Short: : +Long: next +Tags: +Protocols: +Added: 7.36.0 +Magic: divider +Help: Make next URL use its separate set of options +--- +Tells curl to use a separate operation for the following URL and associated +options. This allows you to send several URL requests, each with their own +specific options, for example, such as different user names or custom requests +for each. + +--next will reset all local options and only global ones will have their +values survive over to the operation following the --next instruction. Global +options include --verbose, --trace, --trace-ascii and --fail-early. + +For example, you can do both a GET and a POST in a single command line: + + curl www1.example.com --next -d postthis www2.example.com diff --git a/docs/cmdline-opts/no-alpn.d b/docs/cmdline-opts/no-alpn.d new file mode 100644 index 0000000000..88abb83682 --- /dev/null +++ b/docs/cmdline-opts/no-alpn.d @@ -0,0 +1,11 @@ +Long: no-alpn +Tags: HTTP/2 +Protocols: HTTPS +Added: 7.36.0 +See-also: no-npn http2 +Requires: TLS +Help: Disable the ALPN TLS extension +--- +Disable the ALPN TLS extension. ALPN is enabled by default if libcurl was built +with an SSL library that supports ALPN. ALPN is used by a libcurl that supports +HTTP/2 to negotiate HTTP/2 support with the server during https sessions. diff --git a/docs/cmdline-opts/no-buffer.d b/docs/cmdline-opts/no-buffer.d new file mode 100644 index 0000000000..65a6282f64 --- /dev/null +++ b/docs/cmdline-opts/no-buffer.d @@ -0,0 +1,11 @@ +Long: no-buffer +Short: N +Help: Disable buffering of the output stream +--- +Disables the buffering of the output stream. In normal work situations, curl +will use a standard buffered output stream that will have the effect that it +will output the data in chunks, not necessarily exactly when the data arrives. +Using this option will disable that buffering. + +Note that this is the negated option name documented. You can thus use +--buffer to enforce the buffering. diff --git a/docs/cmdline-opts/no-keepalive.d b/docs/cmdline-opts/no-keepalive.d new file mode 100644 index 0000000000..8fb28a0365 --- /dev/null +++ b/docs/cmdline-opts/no-keepalive.d @@ -0,0 +1,8 @@ +Long: no-keepalive +Help: Disable TCP keepalive on the connection +--- +Disables the use of keepalive messages on the TCP connection. curl otherwise +enables them by default. + +Note that this is the negated option name documented. You can thus use +--keepalive to enforce keepalive. diff --git a/docs/cmdline-opts/no-npn.d b/docs/cmdline-opts/no-npn.d new file mode 100644 index 0000000000..ab0f6de2e0 --- /dev/null +++ b/docs/cmdline-opts/no-npn.d @@ -0,0 +1,12 @@ +Long: no-npn +Tags: Versions HTTP/2 +Protocols: HTTPS +Added: 7.36.0 +Mutexed: +See-also: no-alpn http2 +Requires: TLS +Help: Disable the NPN TLS extension +--- +Disable the NPN TLS extension. NPN is enabled by default if libcurl was built +with an SSL library that supports NPN. NPN is used by a libcurl that supports +HTTP/2 to negotiate HTTP/2 support with the server during https sessions. diff --git a/docs/cmdline-opts/no-progress-meter.d b/docs/cmdline-opts/no-progress-meter.d new file mode 100644 index 0000000000..aff0717d37 --- /dev/null +++ b/docs/cmdline-opts/no-progress-meter.d @@ -0,0 +1,10 @@ +Long: no-progress-meter +Help: Do not show the progress meter +See-also: verbose silent +Added: 7.67.0 +--- +Option to switch off the progress meter output without muting or otherwise +affecting warning and informational messages like --silent does. + +Note that this is the negated option name documented. You can thus use +--progress-meter to enable the progress meter again. diff --git a/docs/cmdline-opts/no-sessionid.d b/docs/cmdline-opts/no-sessionid.d new file mode 100644 index 0000000000..397a158697 --- /dev/null +++ b/docs/cmdline-opts/no-sessionid.d @@ -0,0 +1,13 @@ +Long: no-sessionid +Help: Disable SSL session-ID reusing +Protocols: TLS +Added: 7.16.0 +--- +Disable curl's use of SSL session-ID caching. By default all transfers are +done using the cache. Note that while nothing should ever 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. + +Note that this is the negated option name documented. You can thus use +--sessionid to enforce session-ID caching. diff --git a/docs/cmdline-opts/noproxy.d b/docs/cmdline-opts/noproxy.d new file mode 100644 index 0000000000..a216e75f49 --- /dev/null +++ b/docs/cmdline-opts/noproxy.d @@ -0,0 +1,15 @@ +Long: noproxy +Arg: +Help: List of hosts which do not use proxy +Added: 7.19.4 +--- +Comma-separated list of hosts which do not use a proxy, if one is specified. +The only wildcard 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, +local.com would match local.com, local.com:80, and www.local.com, but not +www.notlocal.com. + +Since 7.53.0, This option overrides the environment variables that disable the +proxy. If there's an environment variable disabling a proxy, you can set +noproxy list to \&"" to override it. diff --git a/docs/cmdline-opts/ntlm-wb.d b/docs/cmdline-opts/ntlm-wb.d new file mode 100644 index 0000000000..7b93384085 --- /dev/null +++ b/docs/cmdline-opts/ntlm-wb.d @@ -0,0 +1,7 @@ +Long: ntlm-wb +Help: Use HTTP NTLM authentication with winbind +Protocols: HTTP +See-also: ntlm proxy-ntlm +--- +Enables NTLM much in the style --ntlm does, but hand over the authentication +to the separate binary ntlmauth application that is executed when needed. diff --git a/docs/cmdline-opts/ntlm.d b/docs/cmdline-opts/ntlm.d new file mode 100644 index 0000000000..baaa1d534d --- /dev/null +++ b/docs/cmdline-opts/ntlm.d @@ -0,0 +1,18 @@ +Long: ntlm +Help: Use HTTP NTLM authentication +Mutexed: basic negotiate digest anyauth +See-also: proxy-ntlm +Protocols: HTTP +Requires: TLS +--- +Enables NTLM authentication. The NTLM authentication method was designed by +Microsoft and is used by IIS web servers. It is a proprietary protocol, +reverse-engineered by clever people and implemented in curl based on their +efforts. This kind of behavior should not be endorsed, you should encourage +everyone who uses NTLM to switch to a public and documented authentication +method instead, such as Digest. + +If you want to enable NTLM for your proxy authentication, then use +--proxy-ntlm. + +If this option is used several times, only the first one is used. diff --git a/docs/cmdline-opts/oauth2-bearer.d b/docs/cmdline-opts/oauth2-bearer.d new file mode 100644 index 0000000000..30466e579d --- /dev/null +++ b/docs/cmdline-opts/oauth2-bearer.d @@ -0,0 +1,12 @@ +Long: oauth2-bearer +Help: OAuth 2 Bearer Token +Arg: +Protocols: IMAP POP3 SMTP HTTP +--- +Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token +is used in conjunction with the user name which can be specified as part of +the --url or --user options. + +The Bearer Token and user name are formatted according to RFC 6750. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/output.d b/docs/cmdline-opts/output.d new file mode 100644 index 0000000000..35f52a2130 --- /dev/null +++ b/docs/cmdline-opts/output.d @@ -0,0 +1,32 @@ +Long: output +Arg: +Short: o +Help: Write to file instead of stdout +See-also: remote-name remote-name-all remote-header-name +--- +Write output to instead of stdout. If you are using {} or [] to fetch +multiple documents, you can use '#' followed by a number in the +specifier. That variable will be replaced with the current string for the URL +being fetched. Like in: + + curl http://{one,two}.example.com -o "file_#1.txt" + +or use several variables like: + + curl http://{site,host}.host[1-5].com -o "#1_#2" + +You may use this option as many times as the number of URLs you have. For +example, if you specify two URLs on the same command line, you can use it like +this: + + curl -o aa example.com -o bb example.net + +and the order of the -o options and the URLs doesn't matter, just that the +first -o is for the first URL and so on, so the above command line can also be +written as + + curl example.com example.net -o aa -o bb + +See also the --create-dirs option to create the local directories +dynamically. Specifying the output as '-' (a single dash) will force the +output to be done to stdout. diff --git a/docs/cmdline-opts/page-footer b/docs/cmdline-opts/page-footer new file mode 100644 index 0000000000..defe7e8b28 --- /dev/null +++ b/docs/cmdline-opts/page-footer @@ -0,0 +1,256 @@ +.SH FILES +.I ~/.curlrc +.RS +Default config file, see --config for details. +.SH ENVIRONMENT +The environment variables can be specified in lower case or upper case. The +lower case version has precedence. http_proxy is an exception as it is only +available in lower case. + +Using an environment variable to set the proxy has the same effect as using +the --proxy option. + +.IP "http_proxy [protocol://][:port]" +Sets the proxy server to use for HTTP. +.IP "HTTPS_PROXY [protocol://][:port]" +Sets the proxy server to use for HTTPS. +.IP "[url-protocol]_PROXY [protocol://][:port]" +Sets the proxy server to use for [url-protocol], where the protocol is a +protocol that curl supports and as specified in a URL. FTP, FTPS, POP3, IMAP, +SMTP, LDAP etc. +.IP "ALL_PROXY [protocol://][:port]" +Sets the proxy server to use if no protocol-specific proxy is set. +.IP "NO_PROXY " +list of host names that shouldn't go through any proxy. If set to an asterisk +\&'*' only, it matches all hosts. Each name in this list is matched as either +a domain name which contains the hostname, or the hostname itself. + +This environment variable disables use of the proxy even when specified with +the --proxy option. That is +.B NO_PROXY=direct.example.com curl -x http://proxy.example.com +.B http://direct.example.com +accesses the target URL directly, and +.B NO_PROXY=direct.example.com curl -x http://proxy.example.com +.B http://somewhere.example.com +accesses the target URL through the proxy. + +The list of host names can also be include numerical IP addresses, and IPv6 +versions should then be given without enclosing brackets. + +.SH "PROXY PROTOCOL PREFIXES" +Since curl version 7.21.7, the proxy string may be specified with a +protocol:// prefix to specify alternative proxy protocols. + +If no protocol is specified in the proxy string or if the string doesn't match +a supported one, the proxy will be treated as an HTTP proxy. + +The supported proxy protocol prefixes are as follows: +.IP "http://" +Makes it use it as an HTTP proxy. The default if no scheme prefix is used. +.IP "https://" +Makes it treated as an \fBHTTPS\fP proxy. +.IP "socks4://" +Makes it the equivalent of --socks4 +.IP "socks4a://" +Makes it the equivalent of --socks4a +.IP "socks5://" +Makes it the equivalent of --socks5 +.IP "socks5h://" +Makes it the equivalent of --socks5-hostname +.SH EXIT CODES +There are a bunch of different error codes and their corresponding error +messages that may appear during bad conditions. At the time of this writing, +the exit codes are: +.IP 1 +Unsupported protocol. This build of curl has no support for this protocol. +.IP 2 +Failed to initialize. +.IP 3 +URL malformed. The syntax was not correct. +.IP 4 +A feature or option that was needed to perform the desired request was not +enabled or was explicitly disabled at build-time. To make curl able to do +this, you probably need another build of libcurl! +.IP 5 +Couldn't resolve proxy. The given proxy host could not be resolved. +.IP 6 +Couldn't resolve host. The given remote host was not resolved. +.IP 7 +Failed to connect to host. +.IP 8 +Weird server reply. The server sent data curl couldn't parse. +.IP 9 +FTP access denied. The server denied login or denied access to the particular +resource or directory you wanted to reach. Most often you tried to change to a +directory that doesn't exist on the server. +.IP 10 +FTP accept failed. 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 11 +FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request. +.IP 12 +During an active FTP session while waiting for the server to connect back to +curl, the timeout expired. +.IP 13 +FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request. +.IP 14 +FTP weird 227 format. Curl couldn't parse the 227-line the server sent. +.IP 15 +FTP can't get host. Couldn't resolve the host IP we got in the 227-line. +.IP 16 +HTTP/2 error. A problem was detected in the HTTP2 framing layer. This is +somewhat generic and can be one out of several problems, see the error message +for details. +.IP 17 +FTP couldn't set binary. Couldn't change transfer method to binary. +.IP 18 +Partial file. Only a part of the file was transferred. +.IP 19 +FTP couldn't download/access the given file, the RETR (or similar) command +failed. +.IP 21 +FTP quote error. A quote command returned error from the server. +.IP 22 +HTTP page not retrieved. The requested url was not found or returned another +error with the HTTP error code being 400 or above. This return code only +appears if --fail is used. +.IP 23 +Write error. Curl couldn't write data to a local filesystem or similar. +.IP 25 +FTP couldn't STOR file. The server denied the STOR operation, used for FTP +uploading. +.IP 26 +Read error. Various reading problems. +.IP 27 +Out of memory. A memory allocation request failed. +.IP 28 +Operation timeout. The specified time-out period was reached according to the +conditions. +.IP 30 +FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT +command, try doing a transfer using PASV instead! +.IP 31 +FTP couldn't use REST. The REST command failed. This command is used for +resumed FTP transfers. +.IP 33 +HTTP range error. The range "command" didn't work. +.IP 34 +HTTP post error. Internal post-request generation error. +.IP 35 +SSL connect error. The SSL handshaking failed. +.IP 36 +Bad download resume. Couldn't continue an earlier aborted download. +.IP 37 +FILE couldn't read file. Failed to open the file. Permissions? +.IP 38 +LDAP cannot bind. LDAP bind operation failed. +.IP 39 +LDAP search failed. +.IP 41 +Function not found. A required LDAP function was not found. +.IP 42 +Aborted by callback. An application told curl to abort the operation. +.IP 43 +Internal error. A function was called with a bad parameter. +.IP 45 +Interface error. A specified outgoing interface could not be used. +.IP 47 +Too many redirects. When following redirects, curl hit the maximum amount. +.IP 48 +Unknown option specified to libcurl. This indicates that you passed a weird +option to curl that was passed on to libcurl and rejected. Read up in the +manual! +.IP 49 +Malformed telnet option. +.IP 51 +The peer's SSL certificate or SSH MD5 fingerprint was not OK. +.IP 52 +The server didn't reply anything, which here is considered an error. +.IP 53 +SSL crypto engine not found. +.IP 54 +Cannot set SSL crypto engine as default. +.IP 55 +Failed sending network data. +.IP 56 +Failure in receiving network data. +.IP 58 +Problem with the local certificate. +.IP 59 +Couldn't use specified SSL cipher. +.IP 60 +Peer certificate cannot be authenticated with known CA certificates. +.IP 61 +Unrecognized transfer encoding. +.IP 62 +Invalid LDAP URL. +.IP 63 +Maximum file size exceeded. +.IP 64 +Requested FTP SSL level failed. +.IP 65 +Sending the data requires a rewind that failed. +.IP 66 +Failed to initialise SSL Engine. +.IP 67 +The user name, password, or similar was not accepted and curl failed to log in. +.IP 68 +File not found on TFTP server. +.IP 69 +Permission problem on TFTP server. +.IP 70 +Out of disk space on TFTP server. +.IP 71 +Illegal TFTP operation. +.IP 72 +Unknown TFTP transfer ID. +.IP 73 +File already exists (TFTP). +.IP 74 +No such user (TFTP). +.IP 75 +Character conversion failed. +.IP 76 +Character conversion functions required. +.IP 77 +Problem with reading the SSL CA cert (path? access rights?). +.IP 78 +The resource referenced in the URL does not exist. +.IP 79 +An unspecified error occurred during the SSH session. +.IP 80 +Failed to shut down the SSL connection. +.IP 82 +Could not load CRL file, missing or wrong format (added in 7.19.0). +.IP 83 +Issuer check failed (added in 7.19.0). +.IP 84 +The FTP PRET command failed +.IP 85 +RTSP: mismatch of CSeq numbers +.IP 86 +RTSP: mismatch of Session Identifiers +.IP 87 +unable to parse FTP file list +.IP 88 +FTP chunk callback reported error +.IP 89 +No connection available, the session will be queued +.IP 90 +SSL public key does not matched pinned public key +.IP 91 +Invalid SSL certificate status. +.IP 92 +Stream error in HTTP/2 framing layer. +.IP XX +More error codes will appear here in future releases. The existing ones +are meant to never change. +.SH AUTHORS / CONTRIBUTORS +Daniel Stenberg is the main author, but the whole list of contributors is +found in the separate THANKS file. +.SH WWW +https://curl.haxx.se +.SH "SEE ALSO" +.BR ftp (1), +.BR wget (1) diff --git a/docs/cmdline-opts/page-header b/docs/cmdline-opts/page-header new file mode 100644 index 0000000000..51f45edadf --- /dev/null +++ b/docs/cmdline-opts/page-header @@ -0,0 +1,141 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at https://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. +.\" * +.\" ************************************************************************** +.\" +.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator. +.\" +.TH curl 1 "16 Dec 2016" "Curl 7.52.0" "Curl Manual" +.SH NAME +curl \- transfer a URL +.SH SYNOPSIS +.B curl [options / URLs] +.SH DESCRIPTION +.B curl +is a tool to transfer data from or to a server, using one of the supported +protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, +LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET +and TFTP). The command is designed to work without user interaction. + +curl offers a busload of useful tricks like proxy support, user +authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer +resume, Metalink, and more. As you will see below, the number of features will +make your head spin! + +curl is powered by libcurl for all transfer-related features. See +\fIlibcurl(3)\fP for details. +.SH URL +The URL syntax is protocol-dependent. You'll find a detailed description in +RFC 3986. + +You can specify multiple URLs or parts of URLs by writing part sets within +braces as in: + + http://site.{one,two,three}.com + +or you can get sequences of alphanumeric series by using [] as in: + + ftp://ftp.example.com/file[1-100].txt + + ftp://ftp.example.com/file[001-100].txt (with leading zeros) + + ftp://ftp.example.com/file[a-z].txt + +Nested sequences are not supported, but you can use several ones next to each +other: + + http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html + +You can specify any amount of URLs on the command line. They will be fetched +in a sequential manner in the specified order. You can specify command line +options and URLs mixed and in any order on the command line. + +You can specify a step counter for the ranges to get every Nth number or +letter: + + http://example.com/file[1-100:10].txt + + http://example.com/file[a-z:2].txt + +When using [] or {} sequences when invoked from a command line prompt, you +probably have to put the full URL within double quotes to avoid the shell from +interfering with it. This also goes for other characters treated special, like +for example '&', '?' and '*'. + +Provide the IPv6 zone index in the URL with an escaped percentage sign and the +interface name. Like in + + http://[fe80::3%25eth0]/ + +If you specify URL without protocol:// prefix, curl will attempt to guess what +protocol you might want. It will then default to HTTP but try other protocols +based on often-used host name prefixes. For example, for host names starting +with "ftp." curl will assume you want to speak FTP. + +curl will do its best to use what you pass to it as a URL. It is not trying to +validate it as a syntactically correct URL by any means but is instead +\fBvery\fP liberal with what it accepts. + +curl will attempt to re-use connections for multiple file transfers, so that +getting many files from the same server will not do multiple connects / +handshakes. This improves speed. Of course this is only done on files +specified on a single command line and cannot be used between separate curl +invokes. +.SH "PROGRESS METER" +curl normally displays a progress meter during operations, indicating the +amount of transferred data, transfer speeds and estimated time left, etc. The +progress meter displays number of bytes and the speeds are in bytes per +second. The suffixes (k, M, G, T, P) are 1024 based. For example 1k is 1024 +bytes. 1M is 1048576 bytes. + +curl displays this data to the terminal by default, so if you invoke curl to +do an operation and it is about to write data to the terminal, it +\fIdisables\fP the progress meter as otherwise it would mess up the output +mixing progress meter and response data. + +If you want a progress meter for HTTP POST or PUT requests, you need to +redirect the response output to a file, using shell redirect (>), --output or +similar. + +It is not the same case for FTP upload as that operation does not spit out +any response data to the terminal. + +If you prefer a progress "bar" instead of the regular meter, --progress-bar is +your friend. You can also disable the progress meter completely with the +--silent option. +.SH OPTIONS +Options start with one or two dashes. Many of the options require an +additional value next to them. + +The short "single-dash" form of the options, -d for example, may be used with +or without a space between it and its value, although a space is a recommended +separator. The long "double-dash" form, --data for example, requires a space +between it and its value. + +Short version options that don't need any additional values can be used +immediately next to each other, like for example you can specify all the +options -O, -L and -v at once as -OLv. + +In general, all boolean options are enabled with --\fBoption\fP and yet again +disabled with --\fBno-\fPoption. That is, you use the exact same option name +but prefix it with "no-". However, in this list we mostly only list and show +the --option version of them. (This concept with --no options was added in +7.19.0. Previously most options were toggled on/off on repeated use of the +same command line option.) diff --git a/docs/cmdline-opts/parallel-immediate.d b/docs/cmdline-opts/parallel-immediate.d new file mode 100644 index 0000000000..343931085b --- /dev/null +++ b/docs/cmdline-opts/parallel-immediate.d @@ -0,0 +1,9 @@ +Long: parallel-immediate +Help: Do not wait for multiplexing (with --parallel) +Added: 7.68.0 +See-also: parallel parallel-max +--- +When doing parallel transfers, this option will instruct curl that it should +rather prefer opening up more connections in parallel at once rather than +waiting to see if new transfers can be added as multiplexed streams on another +connection. diff --git a/docs/cmdline-opts/parallel-max.d b/docs/cmdline-opts/parallel-max.d new file mode 100644 index 0000000000..a8c79c7433 --- /dev/null +++ b/docs/cmdline-opts/parallel-max.d @@ -0,0 +1,9 @@ +Long: parallel-max +Help: Maximum concurrency for parallel transfers +Added: 7.66.0 +See-also: parallel +--- +When asked to do parallel transfers, using --parallel, this option controls +the maximum amount of transfers to do simultaneously. + +The default is 50. diff --git a/docs/cmdline-opts/parallel.d b/docs/cmdline-opts/parallel.d new file mode 100644 index 0000000000..fac84e6243 --- /dev/null +++ b/docs/cmdline-opts/parallel.d @@ -0,0 +1,7 @@ +Short: Z +Long: parallel +Help: Perform transfers in parallel +Added: 7.66.0 +--- +Makes curl perform its transfers in parallel as compared to the regular serial +manner. diff --git a/docs/cmdline-opts/pass.d b/docs/cmdline-opts/pass.d new file mode 100644 index 0000000000..2639cb9d06 --- /dev/null +++ b/docs/cmdline-opts/pass.d @@ -0,0 +1,8 @@ +Long: pass +Arg: +Help: Pass phrase for the private key +Protocols: SSH TLS +--- +Passphrase for the private key + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/path-as-is.d b/docs/cmdline-opts/path-as-is.d new file mode 100644 index 0000000000..946e2f07a2 --- /dev/null +++ b/docs/cmdline-opts/path-as-is.d @@ -0,0 +1,7 @@ +Long: path-as-is +Help: Do not squash .. sequences in URL path +Added: 7.42.0 +--- +Tell curl to not handle sequences of /../ or /./ in the given URL +path. Normally curl will squash or merge them according to standards but with +this option set you tell it not to do that. diff --git a/docs/cmdline-opts/pinnedpubkey.d b/docs/cmdline-opts/pinnedpubkey.d new file mode 100644 index 0000000000..cd21911f85 --- /dev/null +++ b/docs/cmdline-opts/pinnedpubkey.d @@ -0,0 +1,25 @@ +Long: pinnedpubkey +Arg: +Help: FILE/HASHES Public key to verify peer against +Protocols: TLS +--- +Tells curl to use the specified public key file (or hashes) to verify the +peer. This can be a path to a file which contains a single public key in PEM +or DER format, or any number of base64 encoded sha256 hashes preceded by +\'sha256//\' and separated by \';\' + +When negotiating a TLS or SSL connection, the server sends a certificate +indicating its identity. A public key is extracted from this certificate and +if it does not exactly match the public key provided to this option, curl will +abort the connection before sending or receiving any data. + +PEM/DER support: + 7.39.0: OpenSSL, GnuTLS and GSKit + 7.43.0: NSS and wolfSSL + 7.47.0: mbedtls +sha256 support: + 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL + 7.47.0: mbedtls +Other SSL backends not supported. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/post301.d b/docs/cmdline-opts/post301.d new file mode 100644 index 0000000000..87a9fe7edc --- /dev/null +++ b/docs/cmdline-opts/post301.d @@ -0,0 +1,11 @@ +Long: post301 +Help: Do not switch to GET after following a 301 +Protocols: HTTP +See-also: post302 post303 location +Added: 7.17.1 +--- +Tells curl to respect RFC 7231/6.4.2 and not convert POST requests into GET +requests when following a 301 redirection. The non-RFC behaviour is ubiquitous +in web browsers, so curl 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 using --location. diff --git a/docs/cmdline-opts/post302.d b/docs/cmdline-opts/post302.d new file mode 100644 index 0000000000..caf0d87f18 --- /dev/null +++ b/docs/cmdline-opts/post302.d @@ -0,0 +1,11 @@ +Long: post302 +Help: Do not switch to GET after following a 302 +Protocols: HTTP +See-also: post301 post303 location +Added: 7.19.1 +--- +Tells curl to respect RFC 7231/6.4.3 and not convert POST requests into GET +requests when following a 302 redirection. The non-RFC behaviour is ubiquitous +in web browsers, so curl 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 using --location. diff --git a/docs/cmdline-opts/post303.d b/docs/cmdline-opts/post303.d new file mode 100644 index 0000000000..44f39e6104 --- /dev/null +++ b/docs/cmdline-opts/post303.d @@ -0,0 +1,10 @@ +Long: post303 +Help: Do not switch to GET after following a 303 +Protocols: HTTP +See-also: post302 post301 location +Added: 7.26.0 +--- +Tells curl to violate RFC 7231/6.4.4 and not convert POST requests into GET +requests when following 303 redirections. A server may require a POST to +remain a POST after a 303 redirection. This option is meaningful only when +using --location. diff --git a/docs/cmdline-opts/preproxy.d b/docs/cmdline-opts/preproxy.d new file mode 100644 index 0000000000..b8eb77fa4f --- /dev/null +++ b/docs/cmdline-opts/preproxy.d @@ -0,0 +1,22 @@ +Long: preproxy +Arg: [protocol://]host[:port] +Help: Use this proxy first +Added: 7.52.0 +--- +Use the specified SOCKS proxy before connecting to an HTTP or HTTPS --proxy. In +such a case curl first connects to the SOCKS proxy and then connects (through +SOCKS) to the HTTP or HTTPS proxy. Hence pre proxy. + +The pre proxy string should be specified with a protocol:// prefix to specify +alternative proxy protocols. Use socks4://, socks4a://, socks5:// or +socks5h:// to request the specific SOCKS version to be used. No protocol +specified will make curl default to SOCKS4. + +If the port number is not specified in the proxy string, it is assumed to be +1080. + +User and password that might be provided in the proxy string are URL decoded +by curl. This allows you to pass in special characters such as @ by using %40 +or pass in a colon with %3a. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/progress-bar.d b/docs/cmdline-opts/progress-bar.d new file mode 100644 index 0000000000..f27de2d930 --- /dev/null +++ b/docs/cmdline-opts/progress-bar.d @@ -0,0 +1,12 @@ +Short: # +Long: progress-bar +Help: Display transfer progress as a bar +--- +Make curl display transfer progress as a simple progress bar instead of the +standard, more informational, meter. + +This progress bar draws a single line of '#' characters across the screen and +shows a percentage if the transfer size is known. For transfers without a +known size, there will be space ship (-=o=-) that moves back and forth but +only while data is being transferred, with a set of flying hash sign symbols on +top. diff --git a/docs/cmdline-opts/proto-default.d b/docs/cmdline-opts/proto-default.d new file mode 100644 index 0000000000..ccc3b85f38 --- /dev/null +++ b/docs/cmdline-opts/proto-default.d @@ -0,0 +1,18 @@ +Long: proto-default +Help: Use PROTOCOL for any URL missing a scheme +Arg: +Added: 7.45.0 +--- +Tells curl to use \fIprotocol\fP for any URL missing a scheme name. + +Example: + + curl --proto-default https ftp.mozilla.org + +An unknown or unsupported protocol causes error +\fICURLE_UNSUPPORTED_PROTOCOL\fP (1). + +This option does not change the default proxy protocol (http). + +Without this option curl would make a guess based on the host, see --url for +details. diff --git a/docs/cmdline-opts/proto-redir.d b/docs/cmdline-opts/proto-redir.d new file mode 100644 index 0000000000..a1205dd036 --- /dev/null +++ b/docs/cmdline-opts/proto-redir.d @@ -0,0 +1,18 @@ +Long: proto-redir +Arg: +Help: Enable/disable PROTOCOLS on redirect +Added: 7.20.2 +--- +Tells curl to limit what protocols it may use on redirect. Protocols denied by +--proto are not overridden by this option. See --proto for how protocols are +represented. + +Example, allow only HTTP and HTTPS on redirect: + + curl --proto-redir -all,http,https http://example.com + +By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2). +Older versions of curl allowed all protocols on redirect except several +disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and +since 7.40.0 SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP +enables all protocols on redirect, including those disabled for security. diff --git a/docs/cmdline-opts/proto.d b/docs/cmdline-opts/proto.d new file mode 100644 index 0000000000..e1ece1788f --- /dev/null +++ b/docs/cmdline-opts/proto.d @@ -0,0 +1,43 @@ +Long: proto +Arg: +Help: Enable/disable PROTOCOLS +See-also: proto-redir proto-default +Added: 7.20.2 +--- +Tells curl to limit what protocols it may use in the transfer. Protocols are +evaluated left to right, are comma separated, and are each a protocol name or +\&'all', optionally prefixed by zero or more modifiers. Available modifiers are: +.RS +.TP 3 +.B + +Permit this protocol in addition to protocols already permitted (this is +the default if no modifier is used). +.TP +.B - +Deny this protocol, removing it from the list of protocols already permitted. +.TP +.B = +Permit only this protocol (ignoring the list already permitted), though +subject to later modification by subsequent entries in the comma separated +list. +.RE +.IP +For example: +.RS +.TP 15 +.B --proto -ftps +uses the default protocols, but disables ftps +.TP +.B --proto -all,https,+http +only enables http and https +.TP +.B --proto =http,https +also only enables http and https +.RE + +Unknown protocols produce a warning. This allows scripts to safely rely on +being able to disable potentially dangerous protocols, without relying upon +support for that protocol being built into curl to avoid an error. + +This option can be used multiple times, in which case the effect is the same +as concatenating the protocols into one instance of the option. diff --git a/docs/cmdline-opts/proxy-anyauth.d b/docs/cmdline-opts/proxy-anyauth.d new file mode 100644 index 0000000000..b60d0a05e6 --- /dev/null +++ b/docs/cmdline-opts/proxy-anyauth.d @@ -0,0 +1,7 @@ +Long: proxy-anyauth +Help: Pick any proxy authentication method +Added: 7.13.2 +See-also: proxy proxy-basic proxy-digest +--- +Tells curl to pick a suitable authentication method when communicating with +the given HTTP proxy. This might cause an extra request/response round-trip. diff --git a/docs/cmdline-opts/proxy-basic.d b/docs/cmdline-opts/proxy-basic.d new file mode 100644 index 0000000000..566f890a97 --- /dev/null +++ b/docs/cmdline-opts/proxy-basic.d @@ -0,0 +1,7 @@ +Long: proxy-basic +Help: Use Basic authentication on the proxy +See-also: proxy proxy-anyauth proxy-digest +--- +Tells curl to use HTTP Basic authentication when communicating with the given +proxy. Use --basic for enabling HTTP Basic with a remote host. Basic is the +default authentication method curl uses with proxies. diff --git a/docs/cmdline-opts/proxy-cacert.d b/docs/cmdline-opts/proxy-cacert.d new file mode 100644 index 0000000000..2713dd2a4c --- /dev/null +++ b/docs/cmdline-opts/proxy-cacert.d @@ -0,0 +1,7 @@ +Long: proxy-cacert +Help: CA certificate to verify peer against for proxy +Arg: +Added: 7.52.0 +See-also: proxy-capath cacert capath proxy +--- +Same as --cacert but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-capath.d b/docs/cmdline-opts/proxy-capath.d new file mode 100644 index 0000000000..177246aabc --- /dev/null +++ b/docs/cmdline-opts/proxy-capath.d @@ -0,0 +1,7 @@ +Long: proxy-capath +Help: CA directory to verify peer against for proxy +Arg: +Added: 7.52.0 +See-also: proxy-cacert proxy capath +--- +Same as --capath but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-cert-type.d b/docs/cmdline-opts/proxy-cert-type.d new file mode 100644 index 0000000000..906d2a1153 --- /dev/null +++ b/docs/cmdline-opts/proxy-cert-type.d @@ -0,0 +1,6 @@ +Long: proxy-cert-type +Arg: +Added: 7.52.0 +Help: Client certificate type for HTTPS proxy +--- +Same as --cert-type but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-cert.d b/docs/cmdline-opts/proxy-cert.d new file mode 100644 index 0000000000..43acd39509 --- /dev/null +++ b/docs/cmdline-opts/proxy-cert.d @@ -0,0 +1,6 @@ +Long: proxy-cert +Arg: +Help: Set client certificate for proxy +Added: 7.52.0 +--- +Same as --cert but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-ciphers.d b/docs/cmdline-opts/proxy-ciphers.d new file mode 100644 index 0000000000..dcac812845 --- /dev/null +++ b/docs/cmdline-opts/proxy-ciphers.d @@ -0,0 +1,6 @@ +Long: proxy-ciphers +Arg: +Help: SSL ciphers to use for proxy +Added: 7.52.0 +--- +Same as --ciphers but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-crlfile.d b/docs/cmdline-opts/proxy-crlfile.d new file mode 100644 index 0000000000..1d6247f479 --- /dev/null +++ b/docs/cmdline-opts/proxy-crlfile.d @@ -0,0 +1,6 @@ +Long: proxy-crlfile +Arg: +Help: Set a CRL list for proxy +Added: 7.52.0 +--- +Same as --crlfile but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-digest.d b/docs/cmdline-opts/proxy-digest.d new file mode 100644 index 0000000000..ccf46636c2 --- /dev/null +++ b/docs/cmdline-opts/proxy-digest.d @@ -0,0 +1,6 @@ +Long: proxy-digest +Help: Use Digest authentication on the proxy +See-also: proxy proxy-anyauth proxy-basic +--- +Tells curl to use HTTP Digest authentication when communicating with the given +proxy. Use --digest for enabling HTTP Digest with a remote host. diff --git a/docs/cmdline-opts/proxy-header.d b/docs/cmdline-opts/proxy-header.d new file mode 100644 index 0000000000..c1b0bb7c44 --- /dev/null +++ b/docs/cmdline-opts/proxy-header.d @@ -0,0 +1,24 @@ +Long: proxy-header +Arg:
+Help: Pass custom header(s) to proxy +Protocols: HTTP +Added: 7.37.0 +--- +Extra header to include in the request when sending HTTP to a proxy. You may +specify any number of extra headers. This is the equivalent option to --header +but is for proxy communication only like in CONNECT requests when you want a +separate header sent to the proxy to what is sent to the actual remote host. + +curl will make sure that each header you add/replace is sent with the proper +end-of-line marker, you should thus \fBnot\fP add that as a part of the header +content: do not add newlines or carriage returns, they will only mess things +up for you. + +Headers specified with this option will not be included in requests that curl +knows will not be sent to a proxy. + +Starting in 7.55.0, this option can take an argument in @filename style, which +then adds a header for each line in the input file. Using @- will make curl +read the header file from stdin. + +This option can be used multiple times to add/replace/remove multiple headers. diff --git a/docs/cmdline-opts/proxy-insecure.d b/docs/cmdline-opts/proxy-insecure.d new file mode 100644 index 0000000000..762828f43f --- /dev/null +++ b/docs/cmdline-opts/proxy-insecure.d @@ -0,0 +1,5 @@ +Long: proxy-insecure +Help: Do HTTPS proxy connections without verifying the proxy +Added: 7.52.0 +--- +Same as --insecure but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-key-type.d b/docs/cmdline-opts/proxy-key-type.d new file mode 100644 index 0000000000..ce7482ae94 --- /dev/null +++ b/docs/cmdline-opts/proxy-key-type.d @@ -0,0 +1,6 @@ +Long: proxy-key-type +Arg: +Help: Private key file type for proxy +Added: 7.52.0 +--- +Same as --key-type but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-key.d b/docs/cmdline-opts/proxy-key.d new file mode 100644 index 0000000000..e61eb18a99 --- /dev/null +++ b/docs/cmdline-opts/proxy-key.d @@ -0,0 +1,5 @@ +Long: proxy-key +Help: Private key for HTTPS proxy +Arg: +--- +Same as --key but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-negotiate.d b/docs/cmdline-opts/proxy-negotiate.d new file mode 100644 index 0000000000..775f62a9a3 --- /dev/null +++ b/docs/cmdline-opts/proxy-negotiate.d @@ -0,0 +1,8 @@ +Long: proxy-negotiate +Help: Use HTTP Negotiate (SPNEGO) authentication on the proxy +Added: 7.17.1 +See-also: proxy-anyauth proxy-basic +--- +Tells curl to use HTTP Negotiate (SPNEGO) authentication when communicating +with the given proxy. Use --negotiate for enabling HTTP Negotiate (SPNEGO) +with a remote host. diff --git a/docs/cmdline-opts/proxy-ntlm.d b/docs/cmdline-opts/proxy-ntlm.d new file mode 100644 index 0000000000..c30db53b9b --- /dev/null +++ b/docs/cmdline-opts/proxy-ntlm.d @@ -0,0 +1,6 @@ +Long: proxy-ntlm +Help: Use NTLM authentication on the proxy +See-also: proxy-negotiate proxy-anyauth +--- +Tells curl to use HTTP NTLM authentication when communicating with the given +proxy. Use --ntlm for enabling NTLM with a remote host. diff --git a/docs/cmdline-opts/proxy-pass.d b/docs/cmdline-opts/proxy-pass.d new file mode 100644 index 0000000000..3371714ba0 --- /dev/null +++ b/docs/cmdline-opts/proxy-pass.d @@ -0,0 +1,6 @@ +Long: proxy-pass +Arg: +Help: Pass phrase for the private key for HTTPS proxy +Added: 7.52.0 +--- +Same as --pass but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-pinnedpubkey.d b/docs/cmdline-opts/proxy-pinnedpubkey.d new file mode 100644 index 0000000000..abd6dc4aaf --- /dev/null +++ b/docs/cmdline-opts/proxy-pinnedpubkey.d @@ -0,0 +1,16 @@ +Long: proxy-pinnedpubkey +Arg: +Help: FILE/HASHES public key to verify proxy with +Protocols: TLS +--- +Tells curl to use the specified public key file (or hashes) to verify the +proxy. This can be a path to a file which contains a single public key in PEM +or DER format, or any number of base64 encoded sha256 hashes preceded by +\'sha256//\' and separated by \';\' + +When negotiating a TLS or SSL connection, the server sends a certificate +indicating its identity. A public key is extracted from this certificate and +if it does not exactly match the public key provided to this option, curl will +abort the connection before sending or receiving any data. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/proxy-service-name.d b/docs/cmdline-opts/proxy-service-name.d new file mode 100644 index 0000000000..9a73f2be62 --- /dev/null +++ b/docs/cmdline-opts/proxy-service-name.d @@ -0,0 +1,6 @@ +Long: proxy-service-name +Arg: +Help: SPNEGO proxy service name +Added: 7.43.0 +--- +This option allows you to change the service name for proxy negotiation. diff --git a/docs/cmdline-opts/proxy-ssl-allow-beast.d b/docs/cmdline-opts/proxy-ssl-allow-beast.d new file mode 100644 index 0000000000..de96b8436d --- /dev/null +++ b/docs/cmdline-opts/proxy-ssl-allow-beast.d @@ -0,0 +1,5 @@ +Long: proxy-ssl-allow-beast +Help: Allow security flaw for interop for HTTPS proxy +Added: 7.52.0 +--- +Same as --ssl-allow-beast but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-tls13-ciphers.d b/docs/cmdline-opts/proxy-tls13-ciphers.d new file mode 100644 index 0000000000..08961b72e4 --- /dev/null +++ b/docs/cmdline-opts/proxy-tls13-ciphers.d @@ -0,0 +1,16 @@ +Long: proxy-tls13-ciphers +Arg: +help: TLS 1.3 proxy cipher suites +Protocols: TLS +--- +Specifies which cipher suites to use in the connection to your HTTPS proxy +when it negotiates TLS 1.3. The list of ciphers suites must specify valid +ciphers. Read up on TLS 1.3 cipher suite details on this URL: + + https://curl.haxx.se/docs/ssl-ciphers.html + +This option is currently used only when curl is built to use OpenSSL 1.1.1 or +later. If you are using a different SSL backend you can try setting TLS 1.3 +cipher suites by using the --proxy-ciphers option. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/proxy-tlsauthtype.d b/docs/cmdline-opts/proxy-tlsauthtype.d new file mode 100644 index 0000000000..7d0ce8e1a7 --- /dev/null +++ b/docs/cmdline-opts/proxy-tlsauthtype.d @@ -0,0 +1,6 @@ +Long: proxy-tlsauthtype +Arg: +Help: TLS authentication type for HTTPS proxy +Added: 7.52.0 +--- +Same as --tlsauthtype but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-tlspassword.d b/docs/cmdline-opts/proxy-tlspassword.d new file mode 100644 index 0000000000..cf003844e0 --- /dev/null +++ b/docs/cmdline-opts/proxy-tlspassword.d @@ -0,0 +1,6 @@ +Long: proxy-tlspassword +Arg: +Help: TLS password for HTTPS proxy +Added: 7.52.0 +--- +Same as --tlspassword but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-tlsuser.d b/docs/cmdline-opts/proxy-tlsuser.d new file mode 100644 index 0000000000..758a7c953a --- /dev/null +++ b/docs/cmdline-opts/proxy-tlsuser.d @@ -0,0 +1,6 @@ +Long: proxy-tlsuser +Arg: +Help: TLS username for HTTPS proxy +Added: 7.52.0 +--- +Same as --tlsuser but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-tlsv1.d b/docs/cmdline-opts/proxy-tlsv1.d new file mode 100644 index 0000000000..d024eeac36 --- /dev/null +++ b/docs/cmdline-opts/proxy-tlsv1.d @@ -0,0 +1,5 @@ +Long: proxy-tlsv1 +Help: Use TLSv1 for HTTPS proxy +Added: 7.52.0 +--- +Same as --tlsv1 but used in HTTPS proxy context. diff --git a/docs/cmdline-opts/proxy-user.d b/docs/cmdline-opts/proxy-user.d new file mode 100644 index 0000000000..152466daaa --- /dev/null +++ b/docs/cmdline-opts/proxy-user.d @@ -0,0 +1,18 @@ +Long: proxy-user +Short: U +Arg: +Help: Proxy user and password +--- +Specify the user name and password to use for proxy authentication. + +If you use a Windows SSPI-enabled curl binary and do either Negotiate or NTLM +authentication then you can tell curl to select the user name and password +from your environment by specifying a single colon with this option: "-U :". + +On systems where it works, curl will hide the given option argument from +process listings. This is not enough to protect credentials from possibly +getting seen by other users on the same system as they will still be visible +for a brief moment before cleared. Such sensitive data should be retrieved +from a file instead or similar and never used in clear text in a command line. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/proxy.d b/docs/cmdline-opts/proxy.d new file mode 100644 index 0000000000..6506692be8 --- /dev/null +++ b/docs/cmdline-opts/proxy.d @@ -0,0 +1,39 @@ +Long: proxy +Short: x +Arg: [protocol://]host[:port] +Help: Use this proxy +--- +Use the specified proxy. + +The proxy string can be specified with a protocol:// prefix. No protocol +specified or http:// will be treated as HTTP proxy. Use socks4://, socks4a://, +socks5:// or socks5h:// to request a specific SOCKS version to be used. +(The protocol support was added in curl 7.21.7) + +HTTPS proxy support via https:// protocol prefix was added in 7.52.0 for +OpenSSL, GnuTLS and NSS. + +Unrecognized and unsupported proxy protocols cause an error since 7.52.0. +Prior versions may ignore the protocol and use http:// instead. + +If the port number is not specified in the proxy string, it is assumed to be +1080. + +This option overrides existing environment variables that set the proxy to +use. If there's an environment variable setting a proxy, you can set proxy to +\&"" to override it. + +All operations that are performed over an HTTP proxy will transparently be +converted to HTTP. It means that certain protocol specific operations might +not be available. This is not the case if you can tunnel through the proxy, as +one with the --proxytunnel option. + +User and password that might be provided in the proxy string are URL decoded +by curl. This allows you to pass in special characters such as @ by using %40 +or pass in a colon with %3a. + +The proxy host can be specified the exact same way as the proxy environment +variables, including the protocol prefix (http://) and the embedded user + +password. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/proxy1.0.d b/docs/cmdline-opts/proxy1.0.d new file mode 100644 index 0000000000..4a931bd15b --- /dev/null +++ b/docs/cmdline-opts/proxy1.0.d @@ -0,0 +1,10 @@ +Long: proxy1.0 +Arg: +Help: Use HTTP/1.0 proxy on given port +--- +Use the specified HTTP 1.0 proxy. If the port number is not specified, it is +assumed at port 1080. + +The only difference between this and the HTTP proxy option --proxy, is that +attempts to use CONNECT through the proxy will specify an HTTP 1.0 protocol +instead of the default HTTP 1.1. diff --git a/docs/cmdline-opts/proxytunnel.d b/docs/cmdline-opts/proxytunnel.d new file mode 100644 index 0000000000..1f587f1209 --- /dev/null +++ b/docs/cmdline-opts/proxytunnel.d @@ -0,0 +1,12 @@ +Long: proxytunnel +Short: p +Help: Operate through an HTTP proxy tunnel (using CONNECT) +See-also: proxy +--- +When an HTTP proxy is used --proxy, this option will make curl tunnel through +the proxy. The tunnel approach is made with the HTTP proxy CONNECT request and +requires that the proxy allows direct connect to the remote port number curl +wants to tunnel through to. + +To suppress proxy CONNECT response headers when curl is set to output headers +use --suppress-connect-headers. diff --git a/docs/cmdline-opts/pubkey.d b/docs/cmdline-opts/pubkey.d new file mode 100644 index 0000000000..b2e11c024b --- /dev/null +++ b/docs/cmdline-opts/pubkey.d @@ -0,0 +1,14 @@ +Long: pubkey +Arg: +Protocols: SFTP SCP +Help: SSH Public key file name +--- +Public key file name. Allows you to provide your public key in this separate +file. + +If this option is used several times, the last one will be used. + +(As of 7.39.0, curl attempts to automatically extract the public key from the +private key file, so passing this option is generally not required. Note that +this public key extraction requires libcurl to be linked against a copy of +libssh2 1.2.8 or higher that is itself linked against OpenSSL.) diff --git a/docs/cmdline-opts/quote.d b/docs/cmdline-opts/quote.d new file mode 100644 index 0000000000..59a98eafbc --- /dev/null +++ b/docs/cmdline-opts/quote.d @@ -0,0 +1,57 @@ +Long: quote +Short: Q +Help: Send command(s) to server before transfer +Protocols: FTP SFTP +--- + +Send an arbitrary command to the remote FTP or SFTP server. Quote commands are +sent BEFORE the transfer takes place (just after the initial PWD command in an +FTP transfer, to be exact). To make commands take place after a successful +transfer, prefix them with a dash '-'. To make commands be sent after curl +has changed the working directory, just before the transfer command(s), prefix +the command with a '+' (this is only supported for FTP). You may specify any +number of commands. + +If the server returns failure for one of the commands, the entire operation +will be aborted. You must send syntactically correct FTP commands as RFC 959 +defines to FTP servers, or one of the commands listed below to SFTP servers. + +Prefix the command with an asterisk (*) to make curl continue even if the +command fails as by default curl will stop at first failure. + +This option can be used multiple times. + +SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP quote commands +itself before sending them to the server. File names may be quoted +shell-style to embed spaces or special characters. Following is the list of +all supported SFTP quote commands: +.RS +.IP "chgrp group file" +The chgrp command sets the group ID of the file named by the file operand to +the group ID specified by the group operand. The group operand is a decimal +integer group ID. +.IP "chmod mode file" +The chmod command modifies the file mode bits of the specified file. The +mode operand is an octal integer mode number. +.IP "chown user file" +The chown command sets the owner of the file named by the file operand to the +user ID specified by the user operand. The user operand is a decimal +integer user ID. +.IP "ln source_file target_file" +The ln and symlink commands create a symbolic link at the target_file location +pointing to the source_file location. +.IP "mkdir directory_name" +The mkdir command creates the directory named by the directory_name operand. +.IP "pwd" +The pwd command returns the absolute pathname of the current working directory. +.IP "rename source target" +The rename command renames the file or directory named by the source +operand to the destination path named by the target operand. +.IP "rm file" +The rm command removes the file specified by the file operand. +.IP "rmdir directory" +The rmdir command removes the directory entry specified by the directory +operand, provided it is empty. +.IP "symlink source_file target_file" +See ln. +.RE diff --git a/docs/cmdline-opts/random-file.d b/docs/cmdline-opts/random-file.d new file mode 100644 index 0000000000..51626f88dc --- /dev/null +++ b/docs/cmdline-opts/random-file.d @@ -0,0 +1,7 @@ +Long: random-file +Arg: +Help: File for reading random data from +--- +Specify the path name to file containing what will be considered as random +data. The data may be used to seed the random engine for SSL connections. See +also the --egd-file option. diff --git a/docs/cmdline-opts/range.d b/docs/cmdline-opts/range.d new file mode 100644 index 0000000000..b888dd1814 --- /dev/null +++ b/docs/cmdline-opts/range.d @@ -0,0 +1,46 @@ +Long: range +Short: r +Help: Retrieve only the bytes within RANGE +Arg: +Protocols: HTTP FTP SFTP FILE +--- +Retrieve a byte range (i.e. a partial document) from an HTTP/1.1, FTP or SFTP +server or a local FILE. Ranges can be specified in a number of ways. +.RS +.TP 10 +.B 0-499 +specifies the first 500 bytes +.TP +.B 500-999 +specifies the second 500 bytes +.TP +.B -500 +specifies the last 500 bytes +.TP +.B 9500- +specifies the bytes from offset 9500 and forward +.TP +.B 0-0,-1 +specifies the first and last byte only(*)(HTTP) +.TP +.B 100-199,500-599 +specifies two separate 100-byte ranges(*) (HTTP) +.RE +.IP +(*) = NOTE that this will cause the server to reply with a multipart +response! + +Only digit characters (0-9) are valid in the 'start' and 'stop' fields of the +\&'start-stop' range syntax. If a non-digit character is given in the range, +the server's response will be unspecified, depending on the server's +configuration. + +You should also be aware that many HTTP/1.1 servers do not have this feature +enabled, so that when you attempt to get a range, you'll instead get the whole +document. + +FTP and SFTP range downloads only support the simple 'start-stop' syntax +(optionally with one of the numbers omitted). FTP use depends on the extended +FTP command SIZE. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/raw.d b/docs/cmdline-opts/raw.d new file mode 100644 index 0000000000..c3328e69a1 --- /dev/null +++ b/docs/cmdline-opts/raw.d @@ -0,0 +1,7 @@ +Long: raw +Help: Do HTTP "raw"; no transfer decoding +Added: 7.16.2 +Protocols: HTTP +--- +When used, it disables all internal HTTP decoding of content or transfer +encodings and instead makes them passed on unaltered, raw. diff --git a/docs/cmdline-opts/referer.d b/docs/cmdline-opts/referer.d new file mode 100644 index 0000000000..cd84e9d5a0 --- /dev/null +++ b/docs/cmdline-opts/referer.d @@ -0,0 +1,14 @@ +Long: referer +Short: e +Arg: +Protocols: HTTP +Help: Referrer URL +See-also: user-agent header +--- +Sends the "Referrer Page" information to the HTTP server. This can also be set +with the --header flag of course. When used with --location you can append +";auto" to the --referer URL to make curl automatically set the previous URL +when it follows a Location: header. The \&";auto" string can be used alone, +even if you don't set an initial --referer. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/remote-header-name.d b/docs/cmdline-opts/remote-header-name.d new file mode 100644 index 0000000000..771b6d4699 --- /dev/null +++ b/docs/cmdline-opts/remote-header-name.d @@ -0,0 +1,19 @@ +Long: remote-header-name +Short: J +Protocols: HTTP +Help: Use the header-provided filename +--- +This option tells the --remote-name option to use the server-specified +Content-Disposition filename instead of extracting a filename from the URL. + +If the server specifies a file name and a file with that name already exists +in the current working directory it will not be overwritten and an error will +occur. If the server doesn't specify a file name then this option has no +effect. + +There's no attempt to decode %-sequences (yet) in the provided file name, so +this option may provide you with rather unexpected file names. + +\fBWARNING\fP: Exercise judicious use of this option, especially on Windows. A +rogue server could send you the name of a DLL or other file that could possibly +be loaded automatically by Windows or some third party software. diff --git a/docs/cmdline-opts/remote-name-all.d b/docs/cmdline-opts/remote-name-all.d new file mode 100644 index 0000000000..f7a1996793 --- /dev/null +++ b/docs/cmdline-opts/remote-name-all.d @@ -0,0 +1,8 @@ +Long: remote-name-all +Help: Use the remote file name for all URLs +Added: 7.19.0 +--- +This option changes the default action for all given URLs to be dealt with as +if --remote-name were used for each one. So if you want to disable that for a +specific URL after --remote-name-all has been used, you must use "-o -" or +--no-remote-name. diff --git a/docs/cmdline-opts/remote-name.d b/docs/cmdline-opts/remote-name.d new file mode 100644 index 0000000000..9fed64bf4f --- /dev/null +++ b/docs/cmdline-opts/remote-name.d @@ -0,0 +1,21 @@ +Long: remote-name +Short: O +Help: Write output to a file named as the remote file +--- +Write output to a local file named like the remote file we get. (Only the file +part of the remote file is used, the path is cut off.) + +The file will be saved in the current working directory. If you want the file +saved in a different directory, make sure you change the current working +directory before invoking curl with this option. + +The remote file name to use for saving is extracted from the given URL, +nothing else, and if it already exists it will be overwritten. If you want the +server to be able to choose the file name refer to --remote-header-name which +can be used in addition to this option. If the server chooses a file name and +that name already exists it will not be overwritten. + +There is no URL decoding done on the file name. If it has %20 or other URL +encoded parts of the name, they will end up as-is as file name. + +You may use this option as many times as the number of URLs you have. diff --git a/docs/cmdline-opts/remote-time.d b/docs/cmdline-opts/remote-time.d new file mode 100644 index 0000000000..7f6809dc35 --- /dev/null +++ b/docs/cmdline-opts/remote-time.d @@ -0,0 +1,7 @@ +Long: remote-time +Short: R +Help: Set the remote file's time on the local output +--- +When used, this will make curl attempt to figure out the timestamp of the +remote file, and if that is available make the local file get that same +timestamp. diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d new file mode 100644 index 0000000000..b46b4af02e --- /dev/null +++ b/docs/cmdline-opts/request-target.d @@ -0,0 +1,9 @@ +Long: request-target +Help: Specify the target for this request +Protocols: HTTP +Added: 7.55.0 +--- +Tells curl to use an alternative "target" (path) instead of using the path as +provided in the URL. Particularly useful when wanting to issue HTTP requests +without leading slash or other data that doesn't follow the regular URL +pattern, like "OPTIONS *". diff --git a/docs/cmdline-opts/request.d b/docs/cmdline-opts/request.d new file mode 100644 index 0000000000..3919d426a5 --- /dev/null +++ b/docs/cmdline-opts/request.d @@ -0,0 +1,39 @@ +Long: request +Short: X +Arg: +Help: Specify request command to use +--- +(HTTP) Specifies a custom request method to use when communicating with the +HTTP server. The specified request method will be used instead of the method +otherwise used (which defaults to GET). Read the HTTP 1.1 specification for +details and explanations. Common additional HTTP requests include PUT and +DELETE, but related technologies like WebDAV offers PROPFIND, COPY, MOVE and +more. + +Normally you don't need this option. All sorts of GET, HEAD, POST and PUT +requests are rather invoked by using dedicated command line options. + +This option only changes the actual word used in the HTTP request, it does not +alter the way curl behaves. So for example if you want to make a proper HEAD +request, using -X HEAD will not suffice. You need to use the --head option. + +The method string you set with --request will be used for all requests, which +if you for example use --location may cause unintended side-effects when curl +doesn't change request method according to the HTTP 30x response codes - and +similar. + +(FTP) +Specifies a custom FTP command to use instead of LIST when doing file lists +with FTP. + +(POP3) +Specifies a custom POP3 command to use instead of LIST or RETR. (Added in +7.26.0) + +(IMAP) +Specifies a custom IMAP command to use instead of LIST. (Added in 7.30.0) + +(SMTP) +Specifies a custom SMTP command to use instead of HELP or VRFY. (Added in 7.34.0) + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/resolve.d b/docs/cmdline-opts/resolve.d new file mode 100644 index 0000000000..9c37525bd9 --- /dev/null +++ b/docs/cmdline-opts/resolve.d @@ -0,0 +1,27 @@ +Long: resolve +Arg: +Help: Resolve the host+port to this address +Added: 7.21.3 +--- +Provide a custom address for a specific host and port pair. Using this, you +can make the curl requests(s) use a specified address and prevent the +otherwise normally resolved address to be used. Consider it a sort of +/etc/hosts alternative provided on the command line. The port number should be +the number used for the specific protocol the host will be used for. It means +you need several entries if you want to provide address for the same host but +different ports. + +By specifying '*' as host you can tell curl to resolve any host and specific +port pair to the specified address. Wildcard is resolved last so any --resolve +with a specific host and port will be used first. + +The provided address set by this option will be used even if --ipv4 or --ipv6 +is set to make curl use another IP version. + +Support for providing the IP address within [brackets] was added in 7.57.0. + +Support for providing multiple IP addresses per entry was added in 7.59.0. + +Support for resolving with wildcard was added in 7.64.0. + +This option can be used many times to add many host names to resolve. diff --git a/docs/cmdline-opts/retry-connrefused.d b/docs/cmdline-opts/retry-connrefused.d new file mode 100644 index 0000000000..6a78e1fdaa --- /dev/null +++ b/docs/cmdline-opts/retry-connrefused.d @@ -0,0 +1,6 @@ +Long: retry-connrefused +Help: Retry on connection refused (use with --retry) +Added: 7.52.0 +--- +In addition to the other conditions, consider ECONNREFUSED as a transient +error too for --retry. This option is used together with --retry. diff --git a/docs/cmdline-opts/retry-delay.d b/docs/cmdline-opts/retry-delay.d new file mode 100644 index 0000000000..1691356d4c --- /dev/null +++ b/docs/cmdline-opts/retry-delay.d @@ -0,0 +1,11 @@ +Long: retry-delay +Arg: +Help: Wait time between retries +Added: 7.12.3 +--- +Make curl sleep this amount of time before each retry when a transfer has +failed with a transient error (it changes the default backoff time algorithm +between retries). This option is only interesting if --retry is also +used. Setting this delay to zero will make curl use the default backoff time. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/retry-max-time.d b/docs/cmdline-opts/retry-max-time.d new file mode 100644 index 0000000000..0920c92446 --- /dev/null +++ b/docs/cmdline-opts/retry-max-time.d @@ -0,0 +1,13 @@ +Long: retry-max-time +Arg: +Help: Retry only within this period +Added: 7.12.3 +--- +The retry timer is reset before the first transfer attempt. Retries will be +done as usual (see --retry) as long as the timer hasn't reached this given +limit. Notice that if the timer hasn't reached the limit, the request will be +made and while performing, it may take longer than this given time period. To +limit a single request\'s maximum time, use --max-time. Set this option to +zero to not timeout retries. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/retry.d b/docs/cmdline-opts/retry.d new file mode 100644 index 0000000000..3db89b71c0 --- /dev/null +++ b/docs/cmdline-opts/retry.d @@ -0,0 +1,20 @@ +Long: retry +Arg: +Added: 7.12.3 +Help: Retry request if transient problems occur +--- +If a transient error is returned when curl tries to perform a transfer, it +will retry this number of times before giving up. Setting the number to 0 +makes curl do no retries (which is the default). Transient error means either: +a timeout, an FTP 4xx response code or an HTTP 408 or 5xx response code. + +When curl is about to retry a transfer, it will first wait one second and then +for all forthcoming retries it will double the waiting time until it reaches +10 minutes which then will be the delay between the rest of the retries. By +using --retry-delay you disable this exponential backoff algorithm. See also +--retry-max-time to limit the total time allowed for retries. + +Since curl 7.66.0, curl will comply with the Retry-After: response header if +one was present to know when to issue the next retry. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/sasl-authzid.d b/docs/cmdline-opts/sasl-authzid.d new file mode 100644 index 0000000000..b34db97fc0 --- /dev/null +++ b/docs/cmdline-opts/sasl-authzid.d @@ -0,0 +1,11 @@ +Long: sasl-authzid +Help: Use this identity to act as during SASL PLAIN authentication +Added: 7.66.0 +--- +Use this authorisation identity (authzid), during SASL PLAIN authentication, +in addition to the authentication identity (authcid) as specified by --user. + +If the option isn't specified, the server will derive the authzid from the +authcid, but if specified, and depending on the server implementation, it may +be used to access another user's inbox, that the user has been granted access +to, or a shared mailbox for example. diff --git a/docs/cmdline-opts/sasl-ir.d b/docs/cmdline-opts/sasl-ir.d new file mode 100644 index 0000000000..c0dab94635 --- /dev/null +++ b/docs/cmdline-opts/sasl-ir.d @@ -0,0 +1,5 @@ +Long: sasl-ir +Help: Enable initial response in SASL authentication +Added: 7.31.0 +--- +Enable initial response in SASL authentication. diff --git a/docs/cmdline-opts/service-name.d b/docs/cmdline-opts/service-name.d new file mode 100644 index 0000000000..4dfeb27d65 --- /dev/null +++ b/docs/cmdline-opts/service-name.d @@ -0,0 +1,8 @@ +Long: service-name +Help: SPNEGO service name +Arg: +Added: 7.43.0 +--- +This option allows you to change the service name for SPNEGO. + +Examples: --negotiate --service-name sockd would use sockd/server-name. diff --git a/docs/cmdline-opts/show-error.d b/docs/cmdline-opts/show-error.d new file mode 100644 index 0000000000..b9667a4ca5 --- /dev/null +++ b/docs/cmdline-opts/show-error.d @@ -0,0 +1,5 @@ +Long: show-error +Short: S +Help: Show error even when -s is used +--- +When used with --silent, it makes curl show an error message if it fails. diff --git a/docs/cmdline-opts/silent.d b/docs/cmdline-opts/silent.d new file mode 100644 index 0000000000..b0b4425b3d --- /dev/null +++ b/docs/cmdline-opts/silent.d @@ -0,0 +1,11 @@ +Long: silent +Short: s +Help: Silent mode +See-also: verbose stderr +--- +Silent or quiet mode. Don't show progress meter or error messages. Makes Curl +mute. It will still output the data you ask for, potentially even to the +terminal/stdout unless you redirect it. + +Use --show-error in addition to this option to disable progress meter but +still show error messages. diff --git a/docs/cmdline-opts/socks4.d b/docs/cmdline-opts/socks4.d new file mode 100644 index 0000000000..11f6ae033e --- /dev/null +++ b/docs/cmdline-opts/socks4.d @@ -0,0 +1,19 @@ +Long: socks4 +Arg: +Help: SOCKS4 proxy on given host + port +Added: 7.15.2 +--- +Use the specified SOCKS4 proxy. If the port number is not specified, it is +assumed at port 1080. + +This option overrides any previous use of --proxy, as they are mutually +exclusive. + +Since 7.21.7, this option is superfluous since you can specify a socks4 proxy +with --proxy using a socks4:// protocol prefix. + +Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time +--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to +the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/socks4a.d b/docs/cmdline-opts/socks4a.d new file mode 100644 index 0000000000..ae254ae0e8 --- /dev/null +++ b/docs/cmdline-opts/socks4a.d @@ -0,0 +1,19 @@ +Long: socks4a +Arg: +Help: SOCKS4a proxy on given host + port +Added: 7.18.0 +--- +Use the specified SOCKS4a proxy. If the port number is not specified, it is +assumed at port 1080. + +This option overrides any previous use of --proxy, as they are mutually +exclusive. + +Since 7.21.7, this option is superfluous since you can specify a socks4a proxy +with --proxy using a socks4a:// protocol prefix. + +Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time +--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to +the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/socks5-basic.d b/docs/cmdline-opts/socks5-basic.d new file mode 100644 index 0000000000..67d16b3a66 --- /dev/null +++ b/docs/cmdline-opts/socks5-basic.d @@ -0,0 +1,7 @@ +Long: socks5-basic +Help: Enable username/password auth for SOCKS5 proxies +Added: 7.55.0 +--- +Tells curl to use username/password authentication when connecting to a SOCKS5 +proxy. The username/password authentication is enabled by default. Use +--socks5-gssapi to force GSS-API authentication to SOCKS5 proxies. diff --git a/docs/cmdline-opts/socks5-gssapi-nec.d b/docs/cmdline-opts/socks5-gssapi-nec.d new file mode 100644 index 0000000000..477e218e39 --- /dev/null +++ b/docs/cmdline-opts/socks5-gssapi-nec.d @@ -0,0 +1,8 @@ +Long: socks5-gssapi-nec +Help: Compatibility with NEC SOCKS5 server +Added: 7.19.4 +--- +As part of the GSS-API negotiation a protection mode is negotiated. RFC 1961 +says in section 4.3/4.4 it should be protected, but the NEC reference +implementation does not. The option --socks5-gssapi-nec allows the +unprotected exchange of the protection mode negotiation. diff --git a/docs/cmdline-opts/socks5-gssapi-service.d b/docs/cmdline-opts/socks5-gssapi-service.d new file mode 100644 index 0000000000..eb3b2407b3 --- /dev/null +++ b/docs/cmdline-opts/socks5-gssapi-service.d @@ -0,0 +1,12 @@ +Long: socks5-gssapi-service +Arg: +Help: SOCKS5 proxy service name for GSS-API +Added: 7.19.4 +--- +The default service name for a socks server is rcmd/server-fqdn. This option +allows you to change it. + +Examples: --socks5 proxy-name --socks5-gssapi-service sockd would use +sockd/proxy-name --socks5 proxy-name --socks5-gssapi-service sockd/real-name +would use sockd/real-name for cases where the proxy-name does not match the +principal name. diff --git a/docs/cmdline-opts/socks5-gssapi.d b/docs/cmdline-opts/socks5-gssapi.d new file mode 100644 index 0000000000..0070f37eb2 --- /dev/null +++ b/docs/cmdline-opts/socks5-gssapi.d @@ -0,0 +1,8 @@ +Long: socks5-gssapi +Help: Enable GSS-API auth for SOCKS5 proxies +Added: 7.55.0 +--- +Tells curl to use GSS-API authentication when connecting to a SOCKS5 proxy. +The GSS-API authentication is enabled by default (if curl is compiled with +GSS-API support). Use --socks5-basic to force username/password authentication +to SOCKS5 proxies. diff --git a/docs/cmdline-opts/socks5-hostname.d b/docs/cmdline-opts/socks5-hostname.d new file mode 100644 index 0000000000..9d9d946e57 --- /dev/null +++ b/docs/cmdline-opts/socks5-hostname.d @@ -0,0 +1,19 @@ +Long: socks5-hostname +Arg: +Help: SOCKS5 proxy, pass host name to proxy +Added: 7.18.0 +--- +Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If +the port number is not specified, it is assumed at port 1080. + +This option overrides any previous use of --proxy, as they are mutually +exclusive. + +Since 7.21.7, this option is superfluous since you can specify a socks5 +hostname proxy with --proxy using a socks5h:// protocol prefix. + +Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time +--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to +the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/socks5.d b/docs/cmdline-opts/socks5.d new file mode 100644 index 0000000000..22fae76295 --- /dev/null +++ b/docs/cmdline-opts/socks5.d @@ -0,0 +1,21 @@ +Long: socks5 +Arg: +Help: SOCKS5 proxy on given host + port +Added: 7.18.0 +--- +Use the specified SOCKS5 proxy - but resolve the host name locally. If the +port number is not specified, it is assumed at port 1080. + +This option overrides any previous use of --proxy, as they are mutually +exclusive. + +Since 7.21.7, this option is superfluous since you can specify a socks5 proxy +with --proxy using a socks5:// protocol prefix. + +Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time +--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to +the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy. + +If this option is used several times, the last one will be used. + +This option (as well as --socks4) does not work with IPV6, FTPS or LDAP. diff --git a/docs/cmdline-opts/speed-limit.d b/docs/cmdline-opts/speed-limit.d new file mode 100644 index 0000000000..e2b81c79a3 --- /dev/null +++ b/docs/cmdline-opts/speed-limit.d @@ -0,0 +1,10 @@ +Long: speed-limit +Short: Y +Arg: +Help: Stop transfers slower than this +--- +If a download is slower than this given speed (in bytes per second) for +speed-time seconds it gets aborted. speed-time is set with --speed-time and is +30 if not set. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/speed-time.d b/docs/cmdline-opts/speed-time.d new file mode 100644 index 0000000000..98d6ae13c5 --- /dev/null +++ b/docs/cmdline-opts/speed-time.d @@ -0,0 +1,13 @@ +Long: speed-time +Short: y +Arg: +Help: Trigger 'speed-limit' abort after this time +--- +If a download is slower than speed-limit bytes per second during a speed-time +period, the download gets aborted. If speed-time is used, the default +speed-limit will be 1 unless set with --speed-limit. + +This option controls transfers and thus will not affect slow connects etc. If +this is a concern for you, try the --connect-timeout option. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/ssl-allow-beast.d b/docs/cmdline-opts/ssl-allow-beast.d new file mode 100644 index 0000000000..973fcd4518 --- /dev/null +++ b/docs/cmdline-opts/ssl-allow-beast.d @@ -0,0 +1,9 @@ +Long: ssl-allow-beast +Help: Allow security flaw to improve interop +Added: 7.25.0 +--- +This option tells curl to not work around a security flaw in the SSL3 and +TLS1.0 protocols known as BEAST. If this option isn't used, the SSL layer may +use workarounds known to cause interoperability problems with some older SSL +implementations. WARNING: this option loosens the SSL security, and by using +this flag you ask for exactly that. diff --git a/docs/cmdline-opts/ssl-no-revoke.d b/docs/cmdline-opts/ssl-no-revoke.d new file mode 100644 index 0000000000..f94b111436 --- /dev/null +++ b/docs/cmdline-opts/ssl-no-revoke.d @@ -0,0 +1,7 @@ +Long: ssl-no-revoke +Help: Disable cert revocation checks (Schannel) +Added: 7.44.0 +--- +(Schannel) This option tells curl to disable certificate revocation checks. +WARNING: this option loosens the SSL security, and by using this flag you ask +for exactly that. diff --git a/docs/cmdline-opts/ssl-reqd.d b/docs/cmdline-opts/ssl-reqd.d new file mode 100644 index 0000000000..3c6f8a257b --- /dev/null +++ b/docs/cmdline-opts/ssl-reqd.d @@ -0,0 +1,9 @@ +Long: ssl-reqd +Help: Require SSL/TLS +Protocols: FTP IMAP POP3 SMTP +Added: 7.20.0 +--- +Require SSL/TLS for the connection. Terminates the connection if the server +doesn't support SSL/TLS. + +This option was formerly known as --ftp-ssl-reqd. diff --git a/docs/cmdline-opts/ssl.d b/docs/cmdline-opts/ssl.d new file mode 100644 index 0000000000..dabd83761f --- /dev/null +++ b/docs/cmdline-opts/ssl.d @@ -0,0 +1,12 @@ +Long: ssl +Help: Try SSL/TLS +Protocols: FTP IMAP POP3 SMTP +Added: 7.20.0 +--- + +Try to use SSL/TLS for the connection. Reverts to a non-secure connection if +the server doesn't support SSL/TLS. See also --ftp-ssl-control and --ssl-reqd +for different levels of encryption required. + +This option was formerly known as --ftp-ssl (Added in 7.11.0). That option +name can still be used but will be removed in a future version. diff --git a/docs/cmdline-opts/sslv2.d b/docs/cmdline-opts/sslv2.d new file mode 100644 index 0000000000..67d2b85065 --- /dev/null +++ b/docs/cmdline-opts/sslv2.d @@ -0,0 +1,13 @@ +Short: 2 +Long: sslv2 +Tags: Versions +Protocols: SSL +Added: +Mutexed: sslv3 tlsv1 tlsv1.1 tlsv1.2 +Requires: TLS +See-also: http1.1 http2 +Help: Use SSLv2 +--- +Forces curl to use SSL version 2 when negotiating with a remote SSL +server. Sometimes curl is built without SSLv2 support. SSLv2 is widely +considered insecure (see RFC 6176). diff --git a/docs/cmdline-opts/sslv3.d b/docs/cmdline-opts/sslv3.d new file mode 100644 index 0000000000..101ad10047 --- /dev/null +++ b/docs/cmdline-opts/sslv3.d @@ -0,0 +1,13 @@ +Short: 3 +Long: sslv3 +Tags: Versions +Protocols: SSL +Added: +Mutexed: sslv2 tlsv1 tlsv1.1 tlsv1.2 +Requires: TLS +See-also: http1.1 http2 +Help: Use SSLv3 +--- +Forces curl to use SSL version 3 when negotiating with a remote SSL +server. Sometimes curl is built without SSLv3 support. SSLv3 is widely +considered insecure (see RFC 7568). diff --git a/docs/cmdline-opts/stderr.d b/docs/cmdline-opts/stderr.d new file mode 100644 index 0000000000..e8cf7ba68f --- /dev/null +++ b/docs/cmdline-opts/stderr.d @@ -0,0 +1,8 @@ +Long: stderr +Help: Where to redirect stderr +See-also: verbose silent +--- +Redirect all writes to stderr to the specified file instead. If the file name +is a plain '-', it is instead written to stdout. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/styled-output.d b/docs/cmdline-opts/styled-output.d new file mode 100644 index 0000000000..e4751aecb1 --- /dev/null +++ b/docs/cmdline-opts/styled-output.d @@ -0,0 +1,6 @@ +Long: styled-output +Help: Enable styled output for HTTP headers +Added: 7.61.0 +--- +Enables the automatic use of bold font styles when writing HTTP headers to the +terminal. Use --no-styled-output to switch them off. diff --git a/docs/cmdline-opts/suppress-connect-headers.d b/docs/cmdline-opts/suppress-connect-headers.d new file mode 100644 index 0000000000..d208b89177 --- /dev/null +++ b/docs/cmdline-opts/suppress-connect-headers.d @@ -0,0 +1,8 @@ +Long: suppress-connect-headers +Help: Suppress proxy CONNECT response headers +See-also: dump-header include proxytunnel +--- +When --proxytunnel is used and a CONNECT request is made don't output proxy +CONNECT response headers. This option is meant to be used with --dump-header or +--include which are used to show protocol headers in the output. It has no +effect on debug options such as --verbose or --trace, or any statistics. diff --git a/docs/cmdline-opts/tcp-fastopen.d b/docs/cmdline-opts/tcp-fastopen.d new file mode 100644 index 0000000000..08e141df78 --- /dev/null +++ b/docs/cmdline-opts/tcp-fastopen.d @@ -0,0 +1,5 @@ +Long: tcp-fastopen +Added: 7.49.0 +Help: Use TCP Fast Open +--- +Enable use of TCP Fast Open (RFC7413). diff --git a/docs/cmdline-opts/tcp-nodelay.d b/docs/cmdline-opts/tcp-nodelay.d new file mode 100644 index 0000000000..f047a7c6fa --- /dev/null +++ b/docs/cmdline-opts/tcp-nodelay.d @@ -0,0 +1,9 @@ +Long: tcp-nodelay +Help: Use the TCP_NODELAY option +Added: 7.11.2 +--- +Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for +details about this option. + +Since 7.50.2, curl sets this option by default and you need to explicitly +switch it off if you don't want it on. diff --git a/docs/cmdline-opts/telnet-option.d b/docs/cmdline-opts/telnet-option.d new file mode 100644 index 0000000000..a67cb627b8 --- /dev/null +++ b/docs/cmdline-opts/telnet-option.d @@ -0,0 +1,12 @@ +Long: telnet-option +Short: t +Arg: +Help: Set telnet option +--- +Pass options to the telnet protocol. Supported options are: + +TTYPE= Sets the terminal type. + +XDISPLOC= Sets the X display location. + +NEW_ENV= Sets an environment variable. diff --git a/docs/cmdline-opts/tftp-blksize.d b/docs/cmdline-opts/tftp-blksize.d new file mode 100644 index 0000000000..c184328de0 --- /dev/null +++ b/docs/cmdline-opts/tftp-blksize.d @@ -0,0 +1,11 @@ +Long: tftp-blksize +Arg: +Help: Set TFTP BLKSIZE option +Protocols: TFTP +Added: 7.20.0 +--- +Set TFTP BLKSIZE option (must be >512). This is the block size that curl will +try to use when transferring data to or from a TFTP server. By default 512 +bytes will be used. + +If this option is used several times, the last one will be used. diff --git a/docs/cmdline-opts/tftp-no-options.d b/docs/cmdline-opts/tftp-no-options.d new file mode 100644 index 0000000000..e2a4dacd52 --- /dev/null +++ b/docs/cmdline-opts/tftp-no-options.d @@ -0,0 +1,10 @@ +Long: tftp-no-options +Help: Do not send any TFTP options +Protocols: TFTP +Added: 7.48.0 +--- +Tells curl not to send TFTP options requests. + +This option improves interop with some legacy servers that do not acknowledge +or properly implement TFTP options. When this option is used --tftp-blksize is +ignored. diff --git a/docs/cmdline-opts/time-cond.d b/docs/cmdline-opts/time-cond.d new file mode 100644 index 0000000000..830b4e1a24 --- /dev/null +++ b/docs/cmdline-opts/time-cond.d @@ -0,0 +1,17 @@ +Long: time-cond +Short: z +Arg: